C ++ 11:用std :: shared_ptr()replace所有非拥有的原始指针?
随着std::unique_ptr
的出现,瑕疵的std::auto_ptr
最终可以被搁置。 所以最近几天,我一直在改变我的代码使用智能指针,并消除从我的代码的所有delete
。
虽然valgrind说我的代码是内存清理的,但是智能指针的语义丰富性会使代码变得更清晰和更容易理解。
在大多数代码中,翻译很简单:使用std::unique_ptr
代替拥有的对象持有的原始指针,抛出delete
,然后小心地get()
, reset()
和move()
调用需要与其他代码进行良好的交互。
我现在正在将非拥有的原始指针翻译成智能指针。
由于我对我的对象的生命周期(我确保我的模块只依赖于一个方向)的生命周期小心,valgrind告诉我,我没有任何未初始化的读取,悬挂指针或泄漏。 所以,从技术上讲,我现在可以把那些非拥有的原始指针单独留下。
但是,一个select是将那些非拥有的原始指针改为std::shared_ptr
因为我知道它们是非循环的。 或者,将它们作为原始指针会更好吗?
我需要智能指针的资深用户提供一些build议,关于用什么规则来决定是否保留非拥有的原始指针 ,或者将它们转换成std::shared_ptr
,请记住,testing和valgrind我的代码。
编辑:我可能会误解std::shared_ptr
的使用 – 它们可以与std::unique_ptr
一起使用,或者,如果我使用std::shared_ptr
,所有的句柄也应该是std::shared_ptr
?
就个人而言,这是我(或多或less)如何做到的:
- unique_ptrs是唯一的所有权
- 原始指针意味着谁给了我原始指针保证该对象的生命期匹配或超过我的一生。
- shared_ptrs用于共享所有权
- weak_ptrs用于系统在使用前检查对象是否仍然存在。 在我的代码中这是罕见的,因为我发现它有一个更清洁的系统保证它的子系统通过的任何东西的生命周期(在这种情况下,我使用一个原始指针)
到目前为止,我使用比shared_ptrs更多的unique_ptrs,以及比弱指针更多的原始指针。
当你需要多个东西拥有一个资源时,使用一个shared_ptr
(而拥有这些东西的东西可能会以“随机”的方式进入和退出),当一个东西拥有资源时使用unique_ptr
,当你只需要使用一个原始指针引用它并且不拥有它(并且期望这个引用不会持续比存在的资源更长的时间)。
还有第四种types,一种是raw-pointer-for- shared_ptr
,叫做weak_ptr
。 你用它来引用一个shared_ptr
而不用实际拥有它; 然后你可以检查对象是否仍然存在并使用它。
标准库中唯一的非拥有智能指针是std::weak_ptr
。 但是,要使用它,实际拥有的对象需要将指针对象保存在std::shared_ptr
。
我假设你之前使用过std::unique_ptr
。 如果现在将它们转换为shared_ptr
,那么您将获得这样的好处,即您的非拥有指针可以知道所拥有的指针丢失是引用,而原始指针可能会悬空而没有任何机会让非拥有组件检测到这一点。 但是, shared_ptr
会比unique_ptr
产生一个很小的性能和内存开销。
就个人而言,我build议在一般情况下使用一个shared_ptr
和许多weak_ptr
而不是一个unique_ptr
和许多原始指针,如果真的有性能问题,请使用unique_ptr
!