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

std::shared_ptr跨类关联后初始化未同步的问题咨询

问题分析与解决:std::shared_ptr赋值后原指针未同步的原因

核心原因:误解了shared_ptr的赋值行为

你当前的操作是给m_dataMemberInB重新赋值了一个全新的shared_ptr实例,而非修改原有shared_ptr指向的对象,这直接切断了它和m_dataMemberInA的关联。

详细拆解过程

  1. 初始状态:A的m_dataMemberInA是未初始化的空shared_ptr(内部原始指针为nullptr)。
  2. 构造B时的拷贝:将m_dataMemberInA传给B的构造函数时,passedFromA是它的拷贝,随后m_dataMemberInB又拷贝了这个空shared_ptr。此时两者共享同一个空控制块,但指向的对象都是nullptr。
  3. 赋值操作的本质:在anotherMethod中执行m_dataMemberInB = std::make_shared<SomeType>(...)时,你是给m_dataMemberInB替换了一个全新的shared_ptr——它指向新创建的SomeType对象,而m_dataMemberInA仍持有原来的空shared_ptr,两者的关联彻底断开。

正确实现方式

如果要让m_dataMemberInA和m_dataMemberInB始终同步指向同一对象,有两种常见方案:

方案1:同步更新两个shared_ptr

让B持有A的引用,在创建新对象时同时更新A的成员:

class B {
private:
    A& m_aRef;
    std::shared_ptr<SomeType> m_dataMemberInB;
public:
    B(A& a) : m_aRef(a) {
        m_dataMemberInB = m_aRef.m_dataMemberInA;
    }

    void anotherMethod() {
        auto newObj = std::make_shared<SomeType>(arguments...);
        m_dataMemberInB = newObj;
        m_aRef.m_dataMemberInA = newObj; // 同步更新A的成员
    }
};

方案2:修改对象内容而非替换shared_ptr

如果SomeType本身支持修改,先初始化A的m_dataMemberInA,之后只修改对象的属性,不替换shared_ptr:

// 先在A的构造函数中初始化shared_ptr
A::A() : m_dataMemberInA(std::make_shared<SomeType>()) {}

// B的构造函数拷贝已初始化的shared_ptr
B::B(std::shared_ptr<SomeType> passedFromA) : m_dataMemberInB(passedFromA) {}

// 修改对象内容而非替换shared_ptr
void B::anotherMethod() {
    m_dataMemberInB->updateProperty(arguments...);
}

这样A和B的shared_ptr会始终指向同一个对象,修改对象属性会自动同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:03:26