在C ++中开始使用智能指针

时间:2010-10-07 10:31:19

标签: c++ architecture smart-pointers

我有一个C ++应用程序,它广泛使用指针来维护非常复杂的数据结构。该应用程序对大型数据集(可能需要几GB内存)执行数学模拟,并使用Microsoft的Visual Studio 2010进行编译。

我现在正在重新设计应用程序的一个重要部分。为了减少错误(悬空指针,内存泄漏......),我想开始使用智能指针。只要它有限,牺牲记忆或表现就是可以接受的。

实际上,大多数类都在大型池中维护(每个类一个池),尽管这些类可以相互引用,但您可以将该池视为该类所有实例的所有者。但是,如果池决定删除一个实例,我不希望仍然引用已删除实例的任何其他类具有悬空指针。

在另一部分中,我保留了一组指向应用程序中其他模块提供的实例的指针。在实践中,其他模块保持传递的实例的所有权,但在某些情况下,模块不想处理所有权,只是想将实例传递给集合,告诉它“它现在是你的,管理它”。

开始引入智能指针的最佳方法是什么?用智能指针替换[随机]指针似乎不是正确的方法,并且可能无法提供智能指针的所有(或任何)优势。但是什么是更好的方法?

我应该进一步调查哪些类型的智能指针?我有时使用std :: auto_ptr来释放本地分配的内存,但这似乎在C ++ 0x中被删除了。 std :: unique_ptr是更好的选择吗?或者我应该直接使用共享指针或其他类型的智能指针?

问题Replacing existing raw pointers with smart pointers似乎相似但不是问它有多容易,我问的是最好的方法是什么,以及哪种智能指针最适合。

提前感谢您的想法和建议。

2 个答案:

答案 0 :(得分:3)

我建议尽可能使用unique_ptr(这可能需要一些程序分析)和shared_ptr,这是不可能的。如果有疑问,请使用shared_ptr来最大限度地提高安全性:在将控制权移交给容器时,引用计数将简单地转到2,然后返回到1,容器最终会自动delete关联对象。当性能成为问题时,请考虑使用boost::intrusive_ptr

答案 1 :(得分:1)

以下是新C ++ 11标准中发现的3个品种(unique_ptr取代auto_ptr)

http://www.stroustrup.com/C++11FAQ.html#std-unique_ptr

http://www.stroustrup.com/C++11FAQ.html#std-shared_ptr

http://www.stroustrup.com/C++11FAQ.html#std-weak_ptr

您可以阅读每个指针的文本,并说明何时使用哪个指针。对于本地内存管理,unique_ptr是您的选择。它是不可复制的,但是可移动的,所以当你在接收器周围移动它时,它就拥有它。

如果你想共享一个对象实例而没有人真正拥有该对象,并且确保在某个人仍有引用的情况下不会删除它,则使用<_> Shared_ptr。一旦对象的最后一个用户破坏了shared_ptr容器,就会删除包含的对象。

weak_ptr与shared_ptr一起使用。它允许一个人“锁定”以在尝试访问内部对象之前查看引用shared_ptr对象是否仍然存在。