【问题标题】:Smart pointer vs owning raw pointer [closed]智能指针与拥有原始指针 [关闭]
【发布时间】:2015-06-08 14:36:45
【问题描述】:

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

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

它也更容易使用

 MyObject* obj = GetAObject(); // return raw owning pointer

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

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

【问题讨论】:

  • 意见问题与 Stack Overflow 无关。
  • new 不是智能指针的相反选项。裸指针与智能指针相反。
  • 听起来您听说最好使用智能指针,并在不理解的情况下将这个建议铭记在心。请不要那样做。回到你看到的地方,阅读并理解推理。这样做后你就不会再有这个问题了。
  • 虽然这个问题可能可以改写为更客观,但它可能会在此过程中重复。
  • @R.MartinhoFernandes:这可能是 Puppy 对某人之前的 SO 问题的愚蠢概括之一。

标签: c++ pointers


【解决方案1】:

指针的使用应该由您尝试在应用程序中建模的所有权语义来决定。

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

【讨论】:

  • 然而,该语言不支持的语义存在一些歧义。例如,所有weak_ptr 都可以转换为shared_ptr,如果管理不当,可能会通过循环或资源争用问题导致“泄漏”。前段时间我问了一个关于它的问题。 stackoverflow.com/questions/23016854/…
【解决方案2】:

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

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

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

如果合适的话,非拥有原始指针没有错。


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

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

【讨论】:

  • 或非常旧的代码库。
  • @AbhinavGauniyal 重新阅读我的答案。 :P
  • 指向硬件设备的指针呢?这是否被认为是拥有一个原始指针?
  • @ThomasMatthews 如果且仅当指针(及其所有共同所有者,如果有的话)到期时需要进行一些清理(如关闭连接或类似的东西),我会说。但是我不太清楚指向硬件设备的指针是什么,到目前为止我从来没有处理过这样的事情。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    相关资源
    最近更新 更多