C++ 管理共享点C++;

C++ 管理共享点C++;,c++,pointers,smart-pointers,C++,Pointers,Smart Pointers,我正在尝试创建下图所示的关系。 A正在创建一个B对象作为共享指针。然后,它继续将共享指针传递给一组D 但是当B被创建时,它会创建一个C对象,该对象将对a隐藏,并且只有B知道。尽管C必须知道B才能工作 既然已经有一个指向B的共享指针,那么有没有办法从B的构造函数中将该共享指针传递给C 当然,我可以通过将this-指针传递到C,并将其存储为原始指针来实现它。但是当B被破坏时会发生什么呢?然后C会尝试删除B指针,但既然B指针已经在删除过程中,那么会发生什么呢 我希望你能帮我解决这个问题 致以最良好的祝

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

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

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

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

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

致以最良好的祝愿


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

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



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

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

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




另一方面,如果
B
对象管理
C
对象的生存期,则
C
对象可能不需要指向
B
对象的共享指针,而是拥有一个非拥有的(普通原始)对象指向
B
对象的指针。

C
B
的成员对象,对吗?为什么C会尝试删除B?B的生命周期是由共享的PTR管理的,而不是由C.@nwp管理的,这实际上是有意义的。当引用计数为0时删除B时,它将删除C。这样C就不需要删除指针,因为它指向的对象B已被删除?从技术上讲,B比C长,因为B管理C的生存期。这很好,因为C始终可以依赖B指针来有效。但是是的,一旦C被破坏,B将立即跟随,C没有理由做任何事情。如果C有一个指向B的共享指针,B的引用计数怎么可能达到0?当您有一个圆关系时,您可能需要使用弱指针
C
B
的成员对象,对吗?为什么C会尝试删除B?B的生命周期是由共享的PTR管理的,而不是由C.@nwp管理的,这实际上是有意义的。当引用计数为0时删除B时,它将删除C。这样C就不需要删除指针,因为它指向的对象B已被删除?从技术上讲,B比C长,因为B管理C的生存期。这很好,因为C始终可以依赖B指针来有效。但是是的,一旦C被破坏,B将立即跟随,C没有理由做任何事情。如果C有一个指向B的共享指针,B的引用计数怎么可能达到0?当你有一个圈的关系,你可能需要使用弱点纠正。正如@nwp提到的,B比C长,因此一个普通指针就足够了。谢谢。您的解决方案会导致内存泄漏。@user3188346在哪里?成员拥有一个共享的\u ptr给它的所有者。除非您以某种方式使C对象中的共享\u ptr无效,否则B将永远不会被销毁。@user3188346如果
B
对象管理
C
对象的生存期,那么这无关紧要。一个
B
对象创建一个
C
对象,并且
B
对象的参考计数器增加。但随后
B
对象删除
C
对象,并减少参考计数器。一旦包含指向
B
对象的共享指针的所有
C
对象都消失,那么
a
对象中只剩下共享指针。没有泄漏,正确。正如@nwp提到的,B比C长,因此一个普通指针就足够了。谢谢。您的解决方案会导致内存泄漏。@user3188346在哪里?成员拥有一个共享的\u ptr给它的所有者。除非您以某种方式使C对象中的共享\u ptr无效,否则B将永远不会被销毁。@user3188346如果
B
对象管理
C
对象的生存期,那么这无关紧要。一个
B
对象创建一个
C
对象,并且
B
对象的参考计数器增加。但随后
B
对象删除
C
对象,并减少参考计数器。一旦包含指向
B
对象的共享指针的所有
C
对象都消失,那么
a
对象中只剩下共享指针。没有泄漏。