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

开始使用C+中的智能指针+; 我有一个C++应用程序,它广泛地使用指针来维护相当复杂的数据结构。该应用程序对庞大的数据集(可能需要几GB的内存)进行数学模拟,并使用Microsoft的Visual Studio 2010进行编译,c++,architecture,smart-pointers,C++,Architecture,Smart Pointers,我现在正在修改应用程序的一个重要部分。为了减少错误(指针悬空、内存泄漏等),我想开始使用智能指针。牺牲内存或性能是可以接受的,只要它是有限的 实际情况下,大多数类都保持在大池中(每个类一个池),尽管类可以相互引用,但可以将池视为该类的所有实例的所有者。但是,如果池决定删除实例,我不希望仍然引用已删除实例的任何其他类具有悬空指针 在另一部分中,我保留了指向应用程序中其他模块交付的实例的指针集合。实际上,其他模块维护所传递实例的所有权,但在某些情况下,模块不想处理所有权,只想将实例传递给集合,告诉它

我现在正在修改应用程序的一个重要部分。为了减少错误(指针悬空、内存泄漏等),我想开始使用智能指针。牺牲内存或性能是可以接受的,只要它是有限的

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

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

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

我应该进一步研究哪种类型的智能指针?我有时使用std::auto_ptr来释放本地分配的内存,但在C++0x中似乎不赞成这样做。std::unique\u ptr是更好的选择吗?或者我应该直接使用共享指针还是其他类型的智能指针

问题似乎很相似,但我不是问它有多容易,而是问最好的方法是什么,以及哪种智能指针最适合


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

以下是新的C++11标准中的3个变体(unique_ptr取代auto_ptr)

您可以阅读每个指针的文本,其中有关于何时使用的说明。对于本地内存管理,可以选择unique_ptr。它是不可复制的,但可以移动,所以当你移动它时,接收者会获得它的所有权

如果您希望在没有人真正拥有对象的情况下共享对象实例,并确保在有人仍对其有引用时不会将其删除,则使用Shared_ptr。一旦对象的最后一个用户销毁了共享的\u ptr容器,包含的对象将被删除


弱\u ptr与共享\u ptr结合使用。在尝试访问内部对象之前,它允许用户“锁定”以查看引用共享\u ptr对象是否仍然存在。

我建议在可能的情况下使用
唯一\u ptr
(这可能需要一些程序分析),在不可能的情况下使用
共享\u ptr
。如有疑问,请使用
共享\u ptr
以最大限度地提高安全性:当将控制权移交给容器时,引用计数将变为2,然后变回1,容器最终将自动
删除相关对象。当性能成为问题时,考虑使用.< /P> + 1好的建议。您必须进行大量的对象创建/销毁或指针复制,才能看到
共享\u ptr
侵入式\u ptr
之间的性能差异。