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

时间:2011-07-13 19:39:57

标签: c++ smart-pointers

这可能是一个愚蠢的问题,但我只是不确定答案。以下代码读取文件,对于文件的每一行,由“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);
    }
    .....;
}

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

不会发生内存泄漏!

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

当指针指向智能指针时,与指针相关的引用计数器增加1(当指针尚未分配给任何智能指针时,引用计数器为0)。 当智能指针超出范围并被删除时,sp跟踪的指针的引用计数器减1:当引用计数器返回0时,最终删除指针引用的内存。

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