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