std::shared_ptr跨类关联后初始化未同步的问题咨询
核心原因:误解了shared_ptr的赋值行为
你当前的操作是给m_dataMemberInB重新赋值了一个全新的shared_ptr实例,而非修改原有shared_ptr指向的对象,这直接切断了它和m_dataMemberInA的关联。
详细拆解过程
- 初始状态:A的
m_dataMemberInA是未初始化的空shared_ptr(内部原始指针为nullptr)。 - 构造B时的拷贝:将
m_dataMemberInA传给B的构造函数时,passedFromA是它的拷贝,随后m_dataMemberInB又拷贝了这个空shared_ptr。此时两者共享同一个空控制块,但指向的对象都是nullptr。 - 赋值操作的本质:在
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
相关产品推荐
相关产品推荐

