C++ 制作共享的ptr副本时会发生什么情况?

C++ 制作共享的ptr副本时会发生什么情况?,c++,c++11,shared-ptr,C++,C++11,Shared Ptr,我想了解当一个shared_ptr分配给另一个shared_ptr时,如何影响shared_ptr中受管对象的引用计数 我在《C++初级读本》第5版中遇到了以下声明: 例如,与共享_ptr关联的计数器递增 当我们使用它作为赋值的右操作数。。。 当我们将一个新值分配给 共享\u ptr 作为一个例子,其如下所示: auto p = make_shared<int>(42); // object to which p points has one user auto q(p); //

我想了解当一个
shared_ptr
分配给另一个
shared_ptr
时,如何影响
shared_ptr
中受管对象的引用计数

我在《C++初级读本》第5版中遇到了以下声明:

例如,与共享_ptr关联的计数器递增 当我们使用它作为赋值的右操作数。。。 当我们将一个新值分配给 共享\u ptr

作为一个例子,其如下所示:

auto p = make_shared<int>(42); // object to which p points has one user

auto q(p); // p and q point to the same object
           // object to which p and q point has two users

auto r = make_shared<int>(42); // int to which r points has one user
r = q; // assign to r, making it point to a different address
       // increase the use count for the object to which q points
       // reduce the use count of the object to which r had pointed
       // the object r had pointed to has no users; that object is automatically freed
auto p=make_shared(42);//p点有一个用户的对象
自动q(p);//p和q指向同一个对象
//p和q点有两个用户的对象
自动r=使_共享(42);//r点有一个用户的int
r=q;//分配给r,使其指向不同的地址
//增加q点指向的对象的使用计数
//减少r指向的对象的使用计数
//r指向的对象没有用户;该对象将自动释放
当我运行类似的代码时,以上不是我的观察结果:

代码:

#包括
#包括
int main()
{
std::shared_ptr sh1=std::make_shared(1);
std::shared_ptr sh2=std::make_shared(2);
sh2=sh1;

std::cout起初您有
sh1。使用_count=1
sh2。使用_count=1
。现在,当您使用
sh2=sh1
分配时,会发生以下情况:

  • sh2
    计数器减少1,因为
    sh2
    shared\u ptr
    )将使用另一个指针
  • 由于
    sh2.use_count=0
    现在,其指针下的对象
    int(2)
    将被销毁
  • 现在您将
    sh2
    分配给一个新对象,它属于
    sh1
    ,因此它的计数器增加了一个,所以:
    sh2。使用\u count=2
    ,当然也使用
    sh1。使用\u count=2
    ,因为两个
    共享的\u ptr
    对象都指向同一个对象,即
    int(1)
  • 原来我们有

    sh1.use_count =1 and 
    sh2.use_count = 1
    *sh1  = 1 and 
    *sh2  = 2
    

    sh2=sh1
    之后。两者都
    sh1->int(1)我认为之所以会出现这种误解,是因为您认为计数器与指向所属对象的指针一起存储在
    共享\u ptr
    实例中。然而,实际上
    共享\u ptr
    实例只包含指向内部存储对象的指针,该对象包含引用计数器和指向所属对象的指针re当您执行
    sh2=sh1;
    赋值时,您所做的
    sh2
    引用与
    sh1
    相同的内部存储对象,因此
    sh1
    sh2
    报告的计数器值取自同一源。

    sh2=sh1
    释放
    sh2
    的先前数据(由于其引用计数为零而被丢弃),然后在赋值后
    sh2
    sh1
    都引用相同的数据(因此两者的引用计数同样相同:2;如果不是,共享的ptr将毫无价值)。试着打印出
    sh1
    sh2
    的包装指针,这应该很明显。@Someprogrammerdude:是的,没错。sh1和sh2的托管地址(来自
    get()
    )都是相同的post分配,也就是说,它们指向相同的托管元素。
    sh1.use_count =1 and 
    sh2.use_count = 1
    *sh1  = 1 and 
    *sh2  = 2
    
    sh1.use_count == sh2.use_count
    *sh1 == *sh2