这可能是一个愚蠢的问题,但我只是不确定答案。下面的代码读取一个文件,对于文件的每一行,"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(仅增加对象的引用计数器),并充分利用智能指针。