【发布时间】:2012-01-10 10:25:15
【问题描述】:
随着std::unique_ptr的出现,伤痕累累的std::auto_ptr终于可以安息了。所以在过去的几天里,我一直在更改我的代码以使用智能指针并从我的代码中删除所有delete。
虽然 valgrind 说我的代码是内存干净的,但智能指针的语义丰富性将使代码更清晰、更易于理解。
在大部分代码中,翻译很简单:使用std::unique_ptr 代替拥有对象持有的原始指针,扔掉delete,并小心撒上get()、reset() 和@987654329 @ 调用,根据需要,与其余代码很好地交互。
我现在正在将非拥有原始指针转换为智能指针。
由于我对对象的生命周期非常小心(我确保我的模块仅依赖于一个方向),因此 valgrind 告诉我没有任何未初始化的读取、悬空指针或泄漏。所以,从技术上讲,我现在可以不理会那些非拥有的原始指针。
但是,一种选择是将那些 非拥有原始指针 更改为 std::shared_ptr,因为我知道它们是非循环的。或者,将它们保留为原始指针会更好吗?
我需要一些资深智能指针用户的建议,关于您使用什么经验法则来决定是保持 非拥有原始指针 原样,还是将它们转换为std::shared_ptr, 请记住,我经常对代码进行单元测试和验证。
编辑:我可能误解了std::shared_ptr 的使用——它们可以与std::unique_ptr 一起使用,还是如果我使用std::shared_ptr,所有句柄也应该是std::shared_ptr?
【问题讨论】:
-
共享指针拥有
-
所以所有共享指针本质上都“平等地拥有”该对象,对吧?所以我应该将它保留为一个唯一的 ptr + 许多原始指针或只是许多共享指针,这取决于我的语义意图?对吗?
-
@kfmfe04:当您需要多个事物拥有一个资源时使用
shared_ptr(并且拥有事物的人可能会“随机”进出范围),当您需要一个资源时使用unique_ptrthing 拥有该资源,并在您只需要引用它而不拥有它时使用原始指针(并期望此引用不会持续超过资源存在的时间)。 -
你可以使用一个共享ptr和许多弱ptr。
-
有一个关于非拥有的“哑”智能指针的提议,称为“observer_ptr”,它没有真正的目的,只是为了澄清指针的非拥有角色:open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3840.pdf
标签: c++ memory c++11 smart-pointers