智能指针vs拥有原始指针
Smart pointer vs owning raw pointer
据我所知,最好使用智能指针,而不是通过原始指针来管理动态分配对象的生命周期。例如:MyObject* obj = new Object();
但是在一些框架/库中,他们总是返回/使用原始指针而不是智能指针,(也许他们有自己的GC对象?我不知道)。
使用
也更容易 MyObject* obj = GetAObject(); // return raw owning pointer
比SharedPointer<MyObject> obj = GetAObject(); // return smart pointer
应该总是使用智能指针而不是手动new
/delete
(如上面的例子),或者在某些情况下应该使用原始资源拥有指针?
指针的使用应该通过您试图在应用程序中建模的所有权语义来通知。
如果您的库返回原始指针到库管理的内存,那么原始指针绝对没问题。如果它返回指向应用程序应该拥有的内存的指针,那么智能指针是一个更好的选择,因为您可以忘记内存管理,并且您的意图由代码记录。
如果您的代码不需要使用c++ 11之前的编译器进行编译,我认为没有理由拥有原始指针。
甚至如果你的代码需要用旧的编译器编译,你应该看看Boost中的智能指针。
我不知道在任何一种情况下,拥有原始指针会是一个好主意。
如果合适的话,不拥有原始指针没有问题。
确实有很多代码仍然使用原始指针。这应该主要分为两类:
- 比Boost智能指针老的代码/c++ 11
- 不遵循现代c++最佳实践的人编写的代码。
使用智能指针可能会为您节省很多追踪内存泄漏的麻烦。您总是可以将第三方库返回的指针包装成智能指针,但是您需要注意谁是分配内存的真正所有者。您应该阅读库文档,以确保一旦您将分配的内存分配给智能指针,其他人不会干扰它:例如,如您所建议的,如果框架有自己的垃圾收集器。
相关文章:
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 从堆栈分配的原始指针构造智能指针
- 将unique_ptr分配给原始指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- C++原始指针和"delete"
- 为什么 C++ 地址中的矢量无法通过原始指针访问
- 复制后删除原始数组指针将前 3 个字节设置为 0
- 如何正确实现具有原始指针的类的复制构造函数?
- 如何在将原始指针移动到基类构造函数之前从unique_ptr中提取原始指针
- C++指针无法更改其原始值
- 为包含原始指针的对象C++智能指针
- unique_ptr<T>::get() 返回的指针在原始unique_ptr被销毁后不是 nullptr
- c++:复制、删除和运算符=在原始指针映射中
- C++模板,用于通过常量引用和原始指针传递向量
- C++为什么原始指针不会增加shared_ptr的引用计数?
- 从shared_ptr获取原始指针以将其传递给需要 raw 的函数
- 如何包装多级原始指针以赋予其容器语义
- 为什么我可以通过原始指针而不是shared_ptr来修改对象
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上