包含std::shared_ptr<X>成员的Y类如何在X类中完成实例化?
你的代码存在两处核心问题,直接运行会触发未定义行为甚至编译报错:
std::make_shared<Y>要求第二个入参为std::shared_ptr<X>类型,直接传入裸指针this会隐式构造一个独立的智能指针,和原本管理X对象的智能指针共用同一个对象地址但拥有独立的引用计数,最终会导致同一个X对象被释放两次。- 要在类的成员函数中获取指向当前对象的合法
std::shared_ptr,需要借助标准库的std::enable_shared_from_this模板类实现。
正确实现方案
让X类公开继承std::enable_shared_from_this<X>,创建Y实例时调用shared_from_this()方法获取指向当前X对象的合法智能指针即可:
#include <memory> struct X; struct Y { Y(int n, std::shared_ptr<X> x) : n_(n) , x_(x) {} std::shared_ptr<X> x_; int n_; }; // 公开继承enable_shared_from_this模板类 struct X : public std::enable_shared_from_this<X> { void d() { // 调用shared_from_this()获取当前对象的shared_ptr,替代裸指针this auto y = std::make_shared<Y>(20, shared_from_this()); } }; int main() { // 注意:X对象必须由shared_ptr管理,才能正常调用shared_from_this方法 auto x = std::make_shared<X>(); x->d(); return 0; }
注意事项
- 只有当
X对象本身由std::shared_ptr管理时,才能调用shared_from_this(),如果X是栈上分配的对象,调用该方法会触发未定义行为。 - 继承
std::enable_shared_from_this时必须为公开继承,否则无法访问类内的共享计数相关接口。
内容的提问来源于stack exchange,提问作者Cameron121341
相关产品推荐
相关产品推荐

