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