#include <iostream>
#include <memory>
class type
{
public:
type()
{
std::cout << __FUNCTION__ << std::endl;
}
~type()
{
std::cout << __FUNCTION__ << std::endl;
}
};
int main()
{
type* p = new type();
std::shared_ptr<type> ptr1(p);
std::shared_ptr<type> ptr2(p);
int count = ptr2.use_count();
}
两个shared_ptr引用同一个原始指针,那么为什么引用计数为1?
这里
type* p = new type();
p
是一个原始拥有指针。应完全避免原始拥有指针。原始所有权指针不支持管理所有权,这完全取决于您。
接下来,
std::shared_ptr<type> ptr1(p);
您将所有权从
p
转移到 ptr1
。共享指针确实支持管理所有权。当您通过此实例共享所有权时,它会在内部保留引用计数。
接下来,
std::shared_ptr<type> ptr2(p);
您将所有权从
p
转移到
ptr2
。但是,您确实已经将所有权从 p
转移出去。已经有第二个单独的共享指针拥有该对象。 ptr2
无法知道已经存在的其他共享指针,因为您从 p
转移了所有权。 p
是一个原始指针,不支持管理所有权。两个共享指针的引用计数都是 1,因为它们都相信自己是该对象的唯一所有者。
如果您想获得与现有共享指针共享所有权的第二个共享指针,您可以制作一个副本:
type* p = new type();
std::shared_ptr<type> ptr1(p);
std::shared_ptr<type> ptr2(ptr1);
std::cout << ptr2.use_count();
在该代码中,
ptr1
和
ptr2
共享该对象的所有权。无论哪个指针最后离开作用域都会破坏该对象。在您的代码中,两者都会尝试销毁该对象,因为您使它们成为该对象的唯一所有者。智能指针并不会让你不再拥有清晰的所有权概念,而是让你能够在代码中清楚地表达它。您仍然可以错误地使用它们,只是与使用原始指针相比有点困难。