gpt4 book ai didi

c++ - 智能指针,为什么在更改底层对象之前需要检查我是否是唯一用户?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:21:03 25 4
gpt4 key购买 nike

我正在阅读 C++ Primer 并发现这些内容有点令人困惑:

The reset member is often used together with unique to control changes to the object shared among several shared_ptrs. Before changing the underlying object, we check whether we’re the only user. If not, we make a new copy before making the change:

if (!p.unique())
p.reset(new string(*p)); // we aren't alone; allocate a new copy
*p += newVal; // now that we know we're the only pointer, okay to change this object

上面引用的文字中强调的文字是什么意思?好迷茫。

更新:

再次阅读课文,我发现我可能漏掉了什么。

所以根据上面的代码,我们假设有2 shared_ptr(一个就是这里说的p)指向原来的动态内存对象比方说 A。然后,如果我想修改对象 A,我会分配一个新的动态内存,其中包含 A(new string(*p)) 的复制值,将其分配给 p,假设为 B。所以最终 A 没有被修改,而只是创建一个 A 的修改版本的拷贝?

enter image description here

为什么不直接做*p += newVal;?为什么它与答案中提到的写时复制有关?我的意思是,不需要额外的复制操作。所有shared_ptr最初都指向动态内存对象A。只有 1 个对象。


可能提供更多上下文的屏幕截图: enter image description here

最佳答案

我认为这本书的作者在这里描述了如何 Copy-on-write paradigm 可以使用 shared_ptr 来实现。正如之前评论中提到的“这不是 shared_ptr 的要求,它只是一个设计决定”。

关于c++ - 智能指针,为什么在更改底层对象之前需要检查我是否是唯一用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51276822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com