#include <QList>
class MyType{
//This has some data in it....
};
QList<MyType> f()
{
QList<MyType> list;
for(int i = 0; i<10; i++ )
{
MyType* item = new MyType();
list << *item;
}
return list;
}
QList<MyType> temp_var = f();
当temp_var超出范围并销毁时,我们创建并添加到此列表的项目会发生什么? 是否会有任何内存泄漏?
谢谢。
答案 0 :(得分:5)
是的,会有内存泄漏。作为一般规则,您的计划中每个delete
必须有一个new
。
在您的特定情况下,错误逻辑比temp_var
的破坏早得多。您分配项目,然后在列表中存储这些项目的副本。你应该立即销毁原始的,不再有用的物品。
你的for循环可能是:
for(int i = 0; i<10; i++ )
{
MyType* item = new MyType(); // get me an item.
list << *item; // put copy of item in list
delete item; // destroy my item
}
当以这种方式表达时,显然我们根本不应该使用new
!
for(int i = 0; i < 10; i++)
{
MyType item;
list << item;
}
假设MyType
没有任何内存管理错误,此版本不会泄漏。
<小时/> 编辑:顺便说一句,您的计划是:
QList<MyType*> f() // List of POINTERS
{
QList<MyType*> list;
for(int i = 0; i<10; i++ )
{
MyType* item = new MyType();
list << item; // Storing a POINTER
}
return list;
}
然后,是的,你会得到你预期的内存泄漏。 QList
不会自动为指针类型提供delete
。
答案 1 :(得分:3)
我没有看到在代码中使用new
的任何意义,因为您没有将指针存储在列表中,而是使用new创建的对象的副本,而您不会删除它。所以是的,函数本身存在内存泄漏。
看到QList
不是指针列表,我可以说你不应该在代码中使用new
:
QList<MyType> f()
{
QList<MyType> list; //note : its not a list of MyType*
for(int i = 0; i<10; i++ )
{
MyType item; //automatic variable
list << item;
}
return list;
}
答案 2 :(得分:1)
当QList被破坏/超出范围时,它会破坏其内容。在您的情况下,内容由对象的副本(由隐式复制构造函数构建)构成,而不是对象本身。由于new MyType()
创建的原始对象将丢失其指针,但内存将在for循环的每次迭代中泄漏,但将保持分配。
答案 3 :(得分:0)
如果您没有删除使用new MyType()
创建的所有项目,肯定会有泄漏!
在QList
的析构函数中,您需要浏览列表并在每个项目上调用delete。