是否需要手动删除智能指针?



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

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

不会发生内存泄漏!

为什么?因为智能指针是……智能的,它们有自动清理功能,这很好,因为它可以防止难以捉摸的错误,比如内存泄漏。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新