智能指针与拥有原始指针

时间:2015-06-08 14:36:46

标签: c++ pointers

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

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

使用

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

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

是否应始终使用智能指针而不是手动new / delete(如上例所示),或者是否存在应使用原始资源拥有指针的情况?

3 个答案:

答案 0 :(得分:6)

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

即使如果您的代码需要使用古老的编译器编译,您应该查看Boost的智能指针。

我不知道拥有原始指针是个好主意的单一情况。

如果合适,非拥有原始指针没有任何问题。

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

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:1)

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