智能指针的计数器递减如何工作?

pok*_*che 2 c++ smart-pointers shared-ptr

下面是共享指针的示例代码。我在花括号范围内定义了一个共享指针。sp1 由新的 A(计数器 = 1)初始化,并将 sp1 分配给 sp2(复制和/或赋值将计数器加 1,因此计数器 = 2)。我一直认为当计数器变为 0 时会调用 A 的析构函数。但在我的情况下,智能指针即将超出范围(通过花括号)时,计数器为 2。

我的问题是:谁将计数器从 2 更改为 0?

#include <iostream>
#include <memory>

using namespace std;

class A{
public:
    ~A(){

        std::cout << "~A" <<  std::endl;
    }    
};
int main(){
    {
        shared_ptr<A> sp1 (new A); 
        shared_ptr<A> sp2 = sp1;

        std::cout << "sp1 count = " << sp1.use_count() << std::endl;
        std::cout << "sp2 count = " << sp2.use_count() << std::endl;
    }

return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑: 链接到智能指针上的论文

输出:


sp1 计数 = 2

sp2 计数 = 2

~A

Mat*_*son 5

当您的代码到达 main 的末尾时,两个sp1和的析构函数都会sp2运行,它将计数器减为零 - 这是共享指针的一个非常重要的部分,析构函数会减少引用计数,因此,当“什么都没有”留下时,实际共享对象的析构函数被调用。

的析构函数shared_ptr将有一些这样的逻辑:

 counter--;    // Should be atomic!
 if (counter == 0)
 {
    delete owned_thing;
 }
Run Code Online (Sandbox Code Playgroud)