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。是因为我们通过复制返回了一个指针,所以现在我们有两个指针,对吗

  • 当调用
    a
    的解构师时,为什么我们的计数器为3

  • 在类
    B
    中,为什么计数器会增加2

  • 完成类
    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)更改为
to
B(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