C++11 当一个类被另一个类引用并使用getter时,计数器是如何工作的 问题描述
我试图了解C++11 当一个类被另一个类引用并使用getter时,计数器是如何工作的 问题描述,c++11,shared-ptr,C++11,Shared Ptr,我试图了解共享\u ptr计数器是如何工作的。在我的类A中,当我使用getter时,计数器递增1。在类B中使用A的实例时,计数器递增2。当我处理完类B后,A的析构函数被调用了两次 我不明白和困惑我的是: 当我们调用getterA.A()时,为什么A的计数器增加了1。是因为我们通过复制返回了一个指针,所以现在我们有两个指针,对吗 当调用a的解构师时,为什么我们的计数器为3 在类B中,为什么计数器会增加2 完成类B后,如何调用A的析构函数 当我在两个析构函数中使用reset时,它会变得更奇
共享\u ptr
计数器是如何工作的。在我的类A
中,当我使用getter时,计数器递增1。在类B
中使用A
的实例时,计数器递增2。当我处理完类B
后,A
的析构函数被调用了两次
我不明白和困惑我的是:
- 当我们调用getter
时,为什么A.A()
A的计数器增加了1。是因为我们通过复制返回了一个指针,所以现在我们有两个指针,对吗
- 当调用
的解构师时,为什么我们的计数器为3a
- 在类
中,为什么计数器会增加2B
- 完成类
后,如何调用B
的析构函数A
- 当我在两个析构函数中使用
时,它会变得更奇怪reset
源代码
#包括
#包括
使用名称空间std;
甲级{
公众:
A(inta):\u A(make_shared(A)){cout一个快速的答案
- 每次调用
a.a()
时,它都会返回一个指向资源的新共享指针。第一个是成员变量。它们最终会被释放,但没有保证,因为您没有将返回的共享指针存储到变量中(这会将其绑定到范围)
- 析构函数之后的第一个
,
是因为您将A的值
复制到B的构造函数中。如果您希望避免复制,请使用引用B(A&A)
- 数字3是因为有三个共享的_指针,
A
内部指针、返回但未发布的A.A()
结果和传递给B
构造函数的A
副本
- 在类B中,还可以在
B.B()
->递增计数器中返回新的共享指针
我希望这涵盖了您的所有问题,如果您有任何问题,我可以尝试进一步澄清。天哪,这变得很奇怪。我在构造函数中添加了一个cout,并且我得到了一个在B的构造函数之后调用的a的析构函数。请检查您的原始代码中已经存在的析构函数。如果您将B构造函数从B(a)更改为
toB(A&A)
它将消失(不再复制值)。reset
使指针为空。对空指针调用use\u count
将始终为0。@r3musn0x确定它变为0。然后在B内部有一个新的A,然后经过值,然后B指向A。那么回到3。对吗?
#include <iostream>
#include <memory>
using namespace std;
class A {
public:
A(int a):_a( make_shared<int>(a)) {cout <<"A constructor" << endl;}
~A(){/*_a.reset();*/cout <<"After destructor, number of As "<< _a.use_count() <<endl;}
std::shared_ptr<int> a(){return _a;}
//private:
std::shared_ptr<int> _a;
};
class B {
public:
B(A a):_b( make_shared<A>(a)) {cout <<"B constructor" << endl;}
~B(){ /*_b.reset();*/ cout <<"After destructor, number of Bs "<< _b.use_count() << endl;}
std::shared_ptr<A> b(){return _b;}
private:
std::shared_ptr<A> _b;
};
int main()
{
int number = 10;
A a(number);
cout <<"counter of A is " << a._a.use_count() << endl;
cout <<"counter of A is " << a.a().use_count() << endl;
B b(a);
cout <<"counter of A is " << a.a().use_count() << endl;
cout <<"counter of B is " << b.b().use_count() << endl;
return 0;
}
A--->Number: Counter = 1
B(constructor) pass A by value : counter = 2
B--->Number: Counter = 3