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

标签 c++ shared-ptr smart-pointers

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

我的问题是:谁将计数器从 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;
}

编辑: 链接到 smart pointer 上的论文

输出:


sp1 count = 2

sp2 count = 2

~A

最佳答案

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

shared_ptr 的析构函数将具有如下逻辑:

 counter--;    // Should be atomic!
 if (counter == 0)
 {
    delete owned_thing;
 }

关于c++ - 智能指针的计数器递减如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38167324/

相关文章:

c++ - 如何对包含类对象的 "vector"进行排序?为什么我错了?

c++ - 类似于 std::shared_ptr 中的 "cast from/to void"

c++ - 提升 shared_ptr 复制问题

c++ - 为什么 memset() 放在循环体内时不能正常工作?

c++ - 转到函数定义未声明的位置并绕过字符串创建

c++ - 如何对回调函数抛出的异常进行单元测试

c++ - 如何从 std::shared_ptr 转换为 std::unique_ptr?

c++ - QScopedArrayPointer 保护我的数据,但它仍在泄漏

c++ - 使用 unique_ptr<> 实现列表?

c++ - 唯一指针的 Memset