智能指针vs拥有原始指针

Smart pointer vs owning raw pointer

本文关键字:指针 原始 拥有 vs 智能      更新时间:2023-10-16

据我所知,最好使用智能指针,而不是通过原始指针来管理动态分配对象的生命周期。例如:MyObject* obj = new Object();

但是在一些框架/库中,他们总是返回/使用原始指针而不是智能指针,(也许他们有自己的GC对象?我不知道)。

使用

也更容易
 MyObject* obj = GetAObject(); // return raw owning pointer

SharedPointer<MyObject> obj = GetAObject(); // return smart pointer

应该总是使用智能指针而不是手动new/delete(如上面的例子),或者在某些情况下应该使用原始资源拥有指针?

指针的使用应该通过您试图在应用程序中建模的所有权语义来通知。

如果您的库返回原始指针到库管理的内存,那么原始指针绝对没问题。如果它返回指向应用程序应该拥有的内存的指针,那么智能指针是一个更好的选择,因为您可以忘记内存管理,并且您的意图由代码记录。

如果您的代码不需要使用c++ 11之前的编译器进行编译,我认为没有理由拥有原始指针。

甚至如果你的代码需要用旧的编译器编译,你应该看看Boost中的智能指针。

我不知道在任何一种情况下,拥有原始指针会是一个好主意。

如果合适的话,不拥有原始指针没有问题。


确实有很多代码仍然使用原始指针。这应该主要分为两类:

  1. 比Boost智能指针老的代码/c++ 11
  2. 不遵循现代c++最佳实践的人编写的代码。

使用智能指针可能会为您节省很多追踪内存泄漏的麻烦。您总是可以将第三方库返回的指针包装成智能指针,但是您需要注意谁是分配内存的真正所有者。您应该阅读库文档,以确保一旦您将分配的内存分配给智能指针,其他人不会干扰它:例如,如您所建议的,如果框架有自己的垃圾收集器。