关于内存泄漏的问题

时间:2011-05-04 16:50:28

标签: c++ qt memory-leaks

#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超出范围并销毁时,我们创建并添加到此列表的项目会发生什么? 是否会有任何内存泄漏?

谢谢。

4 个答案:

答案 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。