当一个类被另一个类并使用getter引用时,计数器如何工作

时间:2018-12-19 20:20:28

标签: c++11 shared-ptr

问题描述

我试图了解shared_ptr计数器的工作方式。在我的类A中,当我使用吸气剂时,计数器增加1。当在类A中使用B的实例时,计数器增加2。当我完成类{{ 1}}的{​​{1}}的析构函数被调用了两次。

我不明白的是,让我感到困惑的是:

  • 为什么我们调用吸气剂BA的计数器增加1。是因为我们通过Copy返回了一个指针,所以现在我们有2个指针了吗?

  • 为什么调用A的析构函数时计数器为3?

  • a.a()类中,为什么计数器增加2?

  • 完成A类的学习后,如何调用B的析构函数?

  • 当我在两个析构函数中都使用B时,会变得很奇怪。


源代码

A

无复位输出

构造函数
A的计数器是1
A的计数器是2
B构造函数
析构后,As 3的数量
A的计数器是3
B的计数器是2
析构函数后,Bs 1的数量
析构后,As 2的数量
析构后,为As 1

重置输出

构造函数
A的计数器是1
A的计数器是2
B构造函数
析构后,As为0
A的计数器是3
B的计数器是2
析构后,As为0
析构后,B的数目为0
析构后,为As 0

1 个答案:

答案 0 :(得分:1)

快速解答

  • 每次调用a.a()时,它都会返回一个指向资源的新共享指针。第一个是成员变量。它们最终被释放,但是没有隔离区,因为您不将返回的共享指针存储到变量中(该变量将其绑定到作用域)。
  • 第一个After destructor, ...是因为将A a的值复制到B的构造函数中。如果希望避免复制,请使用引用B(A& a)
  • 数字3是由于三个shared_pointer,即内部的A a,返回但未发布的a.a()结果以及将A a的副本传递给{{1}的构造函数}。
  • 在B类中,您还需要在B->递增计数器中返回新的共享指针。

我希望这能涵盖您的所有问题,如果您有任何问题,我可以尝试进一步澄清。