关于内存泄漏的问题

A question about memory leaks

本文关键字:泄漏 问题 内存 于内存      更新时间:2023-10-16
#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超出作用域并销毁时,我们创建并添加到该列表中的项会发生什么?会有内存泄漏吗?

谢谢。

是的,会有内存泄漏。作为一般规则,程序中的每个new必须对应一个delete

在你的具体情况下,错误的逻辑发生早于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本身没有任何内存管理错误。


EDIT:作为题外话,如果您的程序是:

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

我不认为在你的代码中使用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; 
}

当QList被销毁/超出作用域时,它也会同时销毁它的内容。在您的例子中,内容是由对象的副本组成的(从隐式复制构造函数构建),而不是对象本身。内存将在for循环的每次迭代中泄漏,因为new MyType()创建的原始对象将丢失其指针,但仍将保持分配。

如果你不删除你用new MyType()创建的所有项目,肯定会有泄漏!

QList的析构函数中,您需要遍历列表并对每个项调用delete。