【问题标题】:shall I delete smart pointer manually?我应该手动删除智能指针吗?
【发布时间】:2011-10-04 19:17:02
【问题描述】:

这可能是一个愚蠢的问题,但我不确定答案。下面的代码读取一个文件,并且对于文件的每一行,“new”都会创建一个智能指针。如果将来要使用智能指针,则将其存储在列表中,否则不存储。

我的问题是:如果不存储智能指针,会导致潜在的内存泄漏吗?谢谢。

int main(){
    .....;
    std::list<SomeClass> aList;
    while(inFile >> ss){
         std::tr1::shared_ptr<SomeClass> aPtr(new SomeClass());
         //do something in foo(aPtr) to aPtr, 
         //if aPtr will be used later, then it's stored in aList
         //otherwise, it's not stored
         foo(aPtr);
    }
    .....;
}

【问题讨论】:

  • “删除”一词无论如何都是不幸的。对于智能指针,该操作称为reset。 IE。在这种情况下,你可以写aPtr.reset();。但是你很少需要这个;通常当智能指针应该引用另一个对象时使用它:aPtr.reset(new SomeClass("Another Object"));

标签: c++ smart-pointers


【解决方案1】:

只要您使用智能指针的副本存储它,就不会泄漏内存。当aPtr 对象从堆栈中掉下时(在每个while 循环执行结束时),它将被销毁。如果它是分配对象的唯一持有者,它将删除它。但是如果你在别处存储了aPtr的副本,那么它就不是分配对象的唯一持有者,它不会删除它。

【讨论】:

    【解决方案2】:

    不会发生内存泄漏!

    为什么?因为智能指针......很聪明,它们具有非常棒的自动清理功能,因为它可以防止难以捉摸的错误,如内存泄漏。

    因此对于智能指针,您不需要显式删除指针。

    【讨论】:

      【解决方案3】:

      不会造成内存泄漏,因为shared_ptr会在超出范围时释放分配的对象。

      【讨论】:

        【解决方案4】:

        当一个指针被赋值给智能指针时,与该指针相关的引用计数器加一(当指针没有被赋值给任何智能指针时引用计数器为0)。 当智能指针超出范围并被删除时,sp 跟踪的指针的引用计数器减一:最终当引用计数器回到 0 时,指针所引用的内存被删除。

        在您的情况下,如果对象 SomeClass 仅分配给 aPtr,那么自动指针可能会以稍微少一点的开销完成这项工作。 但是,如果将列表声明为std::list&lt;std::tr1::shared_ptr&lt;SomeClass&gt; &gt;,则可以避免复制 SomeClass(只会增加对象的引用计数器)并充分利用智能指针。

        【讨论】:

          猜你喜欢
          • 2012-07-02
          • 2016-09-02
          • 1970-01-01
          • 2012-09-10
          • 1970-01-01
          • 1970-01-01
          • 2014-03-11
          • 1970-01-01
          相关资源
          最近更新 更多