为什么引用计数不是2? [重复]

问题描述 投票:0回答:1
#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?

enter image description here 它指的是同一个地址

c++ pointers std shared-ptr
1个回答
0
投票

这里

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
共享该对象的所有权。无论哪个指针最后离开作用域都会破坏该对象。在您的代码中,两者都会尝试销毁该对象,因为您使它们成为该对象的唯一所有者。
智能指针并不会让你不再拥有清晰的所有权概念,而是让你能够在代码中清楚地表达它。您仍然可以错误地使用它们,只是与使用原始指针相比有点困难。

© www.soinside.com 2019 - 2024. All rights reserved.