You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改get_contained返回引用后遇return-local-addr编译错误求助

问题解析与解决方案

核心原因

你遇到的问题本质是:std::static_pointer_cast<Interface>(m_contained)会生成一个临时的std::shared_ptr<Interface>对象,而非直接引用原成员。

原类成员m_contained是std::shared_ptr<Contained>类型,和std::shared_ptr<Interface>是不同的智能指针类型(尽管它们指向的对象存在继承关系)。static_pointer_cast的作用是创建一个新的智能指针实例,它共享原指针的引用计数,但类型被转换为std::shared_ptr<Interface>。这个新实例是临时右值,无法绑定到非const左值引用;即使加了const,临时对象的生命周期只到当前语句结束,返回它的引用会导致悬垂引用,触发编译错误。

可行的修复方案

如果必须让get_contained返回引用,需要在Container类中直接存储一个std::shared_ptr<Interface>类型的成员,避免每次调用都生成临时对象:

class Interface
{};

class Contained;

class Container
{
public:
    Container() 
        : m_contained(std::make_shared<Contained>(*this)),
          m_contained_interface(m_contained) // 直接初始化转换后的智能指针
    {
    }
    
    std::shared_ptr<Interface>& get_contained()
    {
        return m_contained_interface;
    }

    // 可选:提供const版本
    const std::shared_ptr<Interface>& get_contained() const
    {
        return m_contained_interface;
    }
    
private:
    std::shared_ptr<Contained> m_contained;
    std::shared_ptr<Interface> m_contained_interface; // 新增存储转换后的智能指针
};

class Contained final : public Interface
{
public:
    Contained(Container& container) : m_container(container)
    {
    }
    
private:
    Container& m_container;
};

这样get_contained返回的是类成员的直接引用,不存在临时对象问题,完全符合你的需求。

补充说明

如果你不需要严格返回引用,也可以保留原返回值的写法(返回std::shared_ptr<Interface>值),这种方式虽然会拷贝智能指针,但智能指针的拷贝只是引用计数增减,开销极小,大部分场景下完全可以接受。

内容的提问来源于stack exchange,提问作者CforLinux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 04:20:00