随着到来std::unique_ptr
,该瑕疵std::auto_ptr
终于可以入土为安。 所以在过去的几天里,我一直在改变我的代码使用智能指针和消除所有delete
从我的代码。
虽然说Valgrind的我的代码是内存清洁,智能指针的语义丰富性将使清洁和更容易理解的代码。
在大部分的代码,翻译很简单:使用std::unique_ptr
以代替由所属的对象持有的原始指针的,扔出去delete
,并小心洒get()
reset()
和move()
调用,如需要,与其余代码,界面不错。
我在哪里,我翻译不拥有原始指针智能指针现在的地步。
因为我很小心,我的对象的寿命(我保证我的模块只依赖于一个方向)的valgrind告诉我,我没有任何未初始化的读取,悬摆指针,或泄漏。 因此,技术上,我可以只留下那些不拥有原始指针现在仅。
然而,一个选项是改变那些不拥有原始指针 std::shared_ptr
,因为我知道他们是无环的。 或者,倒不如给他们留下的原始指针?
我需要从智能指针,以你使用什么经验法则的老用户一些建议,以决定是否保留非拥有裸指针原样,或将其转化为std::shared_ptr
,记住,我不断单位-测试的valgrind我的代码。
编辑:我可能会被误解使用std::shared_ptr
-可他们配合使用std::unique_ptr
,或者是它的情况下,如果我使用std::shared_ptr
,所有的手柄也应该是std::shared_ptr
?
就个人而言,这是我(或多或少)是如何做到这一点:
- unique_ptrs是独资
- 原始指针的意思是谁给我的原始指针保证对象的生存期达到或超过我的一生。
- shared_ptrs是用于共享所有权
- weak_ptrs是当系统要检查的对象使用前仍然存在。 这是在我的代码,因为难得,我觉得它更清洁有一个系统保证任何它通过它的子系统(在这种情况下,我使用的是原始指针)寿命
到目前为止我用比shared_ptrs更unique_ptrs,而且比弱指针更原始指针。
使用shared_ptr
,当你需要多东西拥有的资源(包括那些拥有东西可以在“随机”进出的范围),使用unique_ptr
当一个单一的东西拥有的资源,并使用原始指针时,你只需要提到它,而不是拥有它(并期望比资源存在此引用不持续更长的时间)。
有第四类型,一种原始指针换的shared_ptr
的,叫weak_ptr
。 你用它来指代一个shared_ptr
没有实际拥有它; 那么你可以检查对象仍然存在并使用它。
唯一的非拥有智能指针标准库std::weak_ptr
。 但是,要使用它,实际拥有对象需要保持在指针对象std::shared_ptr
。
我假设你使用std::unique_ptr
之前那些。 如果将它们转换为shared_ptr
现在,你有你的非所属指针可以知道,失去了拥有指针引用,而原材料指针可以留给没有任何机会的非所属组件检测到这种悬挂的好处。 然而, shared_ptr
将收取(极?)小的性能和内存开销上unique_ptr
。
就个人而言,我建议使用一个shared_ptr
,很多weak_ptr
s,而不是一个unique_ptr
和许多原始指针在一般情况下,并使用unique_ptr
如果你真的有性能问题!