共享所有权:
The shared_ptr
and weak_ptr
采用的标准与他们的标准几乎相同助推同行。当您需要共享资源并且不知道哪个资源将是最后一个存活时,请使用它们。使用weak_ptr
观察共享资源而不影响其生命周期,不破坏循环。循环与shared_ptr
通常不应该发生 - 两个资源不能互相拥有。
请注意,Boost 还提供shared_array,这可能是一个合适的替代方案shared_ptr<std::vector<T> const>
.
接下来,Boost 提供intrusive_ptr,如果您的资源已经提供引用计数管理并且您希望将其采用 RAII 原则,那么这是一个轻量级解决方案。该标准未采用该标准。
独特的所有权:
升压还有一个scoped_ptr,它是不可复制的,并且您不能为其指定删除程序。std::unique_ptr
is boost::scoped_ptr
类固醇,应该是你的当您需要智能指针时的默认选择。它允许您在其模板参数中指定删除器,并且是movable,不像boost::scoped_ptr
。只要您不使用需要可复制类型的操作(显然),它也可以在 STL 容器中完全使用。
再次注意,Boost 有一个数组版本:scoped_array,该标准通过要求统一std::unique_ptr<T[]>
部分专业化将delete[]
指针而不是delete
荷兰国际集团(与default_delete
r). std::unique_ptr<T[]>
还提供operator[]
代替operator*
and operator->
.
注意std::auto_ptr
仍在标准中,但它是已弃用.
§D.10 [depr.auto.ptr]
类模板auto_ptr
已弃用。 [Note:类模板unique_ptr
(20.7.1)提供了更好的解决方案。——尾注 ]
无所有权:
使用哑指针(原始指针)或引用非拥有参考文献资源并且当您知道资源将过时引用对象/范围。当您需要可空性或可重置性时,首选引用并使用原始指针。
如果您想要对资源进行非拥有引用,但您不知道该资源是否会比引用它的对象寿命更长,请将资源打包在shared_ptr
并使用weak_ptr
- 您可以测试父母是否shared_ptr
还活着lock
,这将返回一个shared_ptr
如果资源仍然存在,则该值不为空。如果想测试资源是否已死亡,请使用expired
。两者听起来很相似,但在并发执行时却有很大不同,如expired
只保证该单个语句的返回值。看似无辜的测试,例如
if(!wptr.expired())
something_assuming_the_resource_is_still_alive();
是一个潜在的竞争条件。