我应该手动删除智能指针吗?

5

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

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

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);
    }
    .....;
}

1
术语“delete”在任何情况下都不太合适。对于智能指针,该操作称为“reset”。也就是说,在这种情况下,您可以编写aPtr.reset();。但是您很少需要这样做;通常情况下,当智能指针应该引用另一个对象时才使用它:aPtr.reset(new SomeClass("Another Object")); - MSalters
4个回答

6
只要您使用智能指针的一个副本存储它,就不会出现内存泄漏问题。当 aPtr 对象从堆栈中弹出(在每个 while 循环执行结束时),它将被销毁。如果它是分配对象的唯一持有者,它将删除该对象。但是,如果您在其他地方存储了 aPtr 的副本,则它不是分配对象的唯一持有者,因此它不会删除它。

3

不会发生内存泄漏!

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

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


0

不会出现内存泄漏,因为当shared_ptr超出作用域时,它将释放已分配的对象。


0
当指针被分配给一个智能指针时,与指针相关的引用计数会增加一(当指针尚未分配给任何智能指针时,引用计数为0)。 当智能指针超出范围并被删除时,由sp跟踪的指针的引用计数减少1:当引用计数返回0时,指针引用的内存最终被删除。
在您的情况下,如果对象SomeClass仅分配给aPtr,则可能使用auto pointer来完成任务,并带有稍微较少的开销。 但是,如果将列表声明为> >,则可以避免复制SomeClass(仅增加对象的引用计数),并充分利用智能指针。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接