修改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
相关产品推荐
相关产品推荐

