哪一行代码使 shared_ptr 的引用计数增加?

Posted

技术标签:

【中文标题】哪一行代码使 shared_ptr 的引用计数增加?【英文标题】:Which line of the code make the reference count of a shared_ptr increasing? 【发布时间】:2018-05-13 12:13:10 【问题描述】:

我正在寻找一种方法来确定哪一行代码负责增加 shared_ptr 的引用计数?例如,假设我有一个智能指针并且它的引用计数是 12。我倾向于知道我的项目中的哪一行 c++ 代码或赋值运算符负责,只要它是 13。

感谢您的帮助

【问题讨论】:

调试器。断点。引用计数为 13 的断点条件。 按值将 shared_ptr 传递给函数将继续增加计数。为避免这种情况,您可以通过引用传递 shared_ptr。 【参考方案1】:

这是依赖于标准库实现的,因为 shared_ptr 的实现不是语言标准的一部分。

当然,它必须是在构造、分配和复制构造时执行的行。在库源文件中查找这三个。

如果你真的必须看一个例子,GCC 的 libstdc++' 共享 ptr 代码在这里:

bits/shared_ptr_base.h bits/shared_ptr.h

但它并不漂亮....

【讨论】:

【参考方案2】:

shared_ptr 的引用计数是共享共同所有权的shared_ptr 对象的数量。因此,每当您使用采用weak_ptr 或左值shared_ptr 的构造函数创建新的shared_ptr 时,并且每当您将左值shared_ptr 分配给另一个shared_ptr 时,都会增加引用计数。

请注意,复制(实际上是移动)shared_ptr 类型的右值不会修改引用计数,因为右值是从移动(清空)的,因此引用是转移而不是添加。

【讨论】:

以上是关于哪一行代码使 shared_ptr 的引用计数增加?的主要内容,如果未能解决你的问题,请参考以下文章

C++智能指针shared_ptr 定位删除器(仿函数)

检测引用计数对象中的内存泄漏

简单的shared_ptr实现

关于智能指针类型shared_ptr的计数问题

shared_ptr(作为局部变量返回)

shared_ptr 引用计数