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

包含std::shared_ptr<X>成员的Y类如何在X类中完成实例化?

你的代码存在两处核心问题,直接运行会触发未定义行为甚至编译报错:

  1. std::make_shared<Y>要求第二个入参为std::shared_ptr<X>类型,直接传入裸指针this会隐式构造一个独立的智能指针,和原本管理X对象的智能指针共用同一个对象地址但拥有独立的引用计数,最终会导致同一个X对象被释放两次。
  2. 要在类的成员函数中获取指向当前对象的合法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:48:03