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

Pat*_*ick 6 c++ architecture smart-pointers

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

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

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

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

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

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

用智能指针替换现有原始指针的问题似乎相似,但不是问它有多容易,我问的是最好的方法是什么,以及哪种智能指针最适合.

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

Dav*_*vid 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对象是否仍然存在。