管理 sharedPointers C++

Posted

技术标签:

【中文标题】管理 sharedPointers C++【英文标题】:Managing sharedPointers C++ 【发布时间】:2017-04-19 11:43:29 【问题描述】:

我正在尝试创建下图中显示的关系。 A 正在创建一个 B 对象作为共享指针。然后它继续将共享指针传递给一堆 D。

但是当一个 B 被创建时,它会创建一个 C 对象,该对象对 A 是隐藏的,并且只有 B 知道。虽然 C 必须知道 B 才能工作。

既然已经有一个指向 B 的共享指针,有没有办法从 B 的构造函数中将该共享指针传递给 C?

当然,我可以通过将this-指针传递给C 来使其工作,并将其存储为原始指针。但是当 B 被破坏时会发生什么?然后 C 会尝试删除 B 指针,但既然已经在删除过程中,那么会发生什么?

我希望你能帮我解决这个问题。

最好的问候。

【问题讨论】:

CB 的成员对象吧? 为什么 C 会尝试删除 B? B 的生命周期由 shared_ptrs 管理,而不是由 C 管理。 @nwp 这实际上是有道理的。当 refCount 为 0 时 B 被删除,它会删除 C。C 就不需要删除指针,因为它指向的对象 B 已经被删除了? 从技术上讲,B 比 C 寿命长,因为 B 管理 C 的生命周期。这很好,因为 C 始终可以依赖 B 指针有效。但是是的,一旦 C 被破坏,B 将立即跟进,C 没有理由做任何事情。 如果 C 有一个指向 B 的共享指针,B 的引用计数怎么会达到 0?当你有循环关系时,你可能需要使用弱指针 【参考方案1】:

如果我理解正确,那么B 可以继承std::enable_shared_from_this,并在创建C 对象时传递其自身的共享指针。可能C 对象应该有一个std::weak_ptr 到它的“父”B 对象。

如果没有弱指针,C 对象的生命周期必须完全由B 对象管理。


另一方面,如果B 对象管理C 对象的生命周期,那么C 对象可能不需要指向B 对象的共享指针,而是具有非拥有(普通raw) 指向B 对象的指针。

【讨论】:

正确。正如@nwp 提到的,B 比 C 寿命长,因此一个普通的指针就足够了。谢谢。 您的解决方案引入了内存泄漏。 @user3188346 在哪里? 该成员对其所有者拥有一个 shared_ptr。除非您以某种方式使 C 对象中的 shared_ptr 无效,否则 B 将永远不会被销毁。 @user3188346 如果B 对象管理C 对象的生命周期,那么没关系。一个B 对象创建一个C 对象,并且B 对象的引用计数器增加。但随后B 对象删除 C 对象并且引用计数器减少。一旦包含指向B 对象的共享指针的所有C 对象都消失了,那么在A 对象中将只剩下共享指针。没有泄漏。

以上是关于管理 sharedPointers C++的主要内容,如果未能解决你的问题,请参考以下文章

第28课 再论智能指针(下)

自主研发平台POIN4.2揭秘系列 --分布式事务

C中空指针的指针算法

c/c++这程序哪出错了

linux 磁盘管理四部曲——mount挂载,/etc/fstab配置文件

C++ - 未分配被释放的指针