关于内存泄漏的问题

Ars*_*ham 1 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();
Run Code Online (Sandbox Code Playgroud)

当temp_var超出范围并销毁时,我们创建并添加到此列表的项目会发生什么?是否会有任何内存泄漏?

谢谢.

Rob*_*obᵩ 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
 }
Run Code Online (Sandbox Code Playgroud)

当这样表达时,很明显我们根本不应该使用new!

for(int i = 0; i < 10; i++)
{
    MyType item;
    list << item;
}
Run Code Online (Sandbox Code Playgroud)

假设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;
}
Run Code Online (Sandbox Code Playgroud)

然后,是的,你会得到你预期的内存泄漏.QList不会自动提供delete指针类型.