有哪些C ++智能指针实现?

时间:2011-02-17 07:29:55

标签: c++ smart-pointers c++-faq

比较,优点,缺点和何时使用?

这是garbage collection thread的衍生产品,我认为这是一个简单的答案,会产生很多关于某些特定智能指针实现的评论,所以看起来值得开始一个新帖子。

最终问题是C ++中智能指针的各种实现是什么,它们如何比较?只是简单的利弊或异常,并找到你可能认为应该有用的东西。

我已经发布了一些我已经使用过或者至少已经掩盖并且考虑在下面作为答案使用的实现,并且我对它们的差异和相似性的理解可能不是100%准确所以请随意检查或纠正我根据需要。

目标是了解一些新的对象和库,或者纠正我对已经广泛使用的现有实现的使用和理解,并最终为其他人提供合适的参考。

3 个答案:

答案 0 :(得分:227)

答案 1 :(得分:5)

还有Loki实现基于策略的智能指针。

关于基于策略的智能指针的其他参考,解决了许多编译器对空基优化的不良支持以及多重继承的问题:

答案 2 :(得分:1)

除了给出的,还有一些安全导向的:

SaferCPlusPlus

mse::TRefCountingPointer是一个引用计数智能指针,如std::shared_ptr。区别在于mse::TRefCountingPointer更安全,更小,更快,但没有任何线程安全机制。并且它出现了" not null"和#34;固定" (非重定向)版本,可以安全地假设始终指向有效分配的对象。所以基本上,如果您的目标对象在异步线程之间共享,那么使用std::shared_ptr,否则mse::TRefCountingPointer更为理想。

mse::TScopeOwnerPointerboost::scoped_ptr类似,但与mse::TScopeFixedPointer一起使用强弱"强弱"指针关系类似于std::shared_ptrstd::weak_ptr

mse::TScopeFixedPointer指向在堆栈上分配的对象,或者拥有"拥有"指针在堆栈上分配。它(故意)限制了它的功能,以增加编译时的安全性,而无需运行时成本。 "范围"指针本质上是为了识别一组简单且确定的环境,以至于不需要(运行时)安全机制。

mse::TRegisteredPointer的行为类似于原始指针,除了在销毁目标对象时其值自动设置为null_ptr。在大多数情况下,它可以用作原始指针的一般替代品。像原始指针一样,它没有任何内在的线程安全性。但作为交换,它对于在堆栈上分配的对象(并获得相应的性能优势)没有问题。启用运行时检查时,此指针可以安全地访问无效内存。因为mse::TRegisteredPointer在指向有效对象时具有与原始指针相同的行为,所以它可以被禁用" (使用编译时指令自动替换为相应的原始指针),允许它用于帮助捕获调试/测试/测试模式中的错误,同时在发布模式下不会产生开销成本。

Here是一篇描述为何以及如何使用它们的文章。 (注意,无耻插头。)