【问题标题】:A question about memory leaks关于内存泄漏的问题
【发布时间】:2011-05-04 16:50:27
【问题描述】:
#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 超出范围并销毁时,我们创建并添加到此列表中的项目会发生什么? 会不会有内存泄漏?

谢谢。

【问题讨论】:

  • 要清楚——在您的示例程序中,您没有将分配的对象存储在QList 中,也没有存储指向已分配对象的指针。您正在存储已分配对象的 副本。看来你是想问其他问题?你的意思是问“当指针列表被销毁时会发生什么?”
  • @Rob:你是对的,问题应该是“当指针列表被销毁时会发生什么?”显而易见的答案是“内存泄漏”.. 但正如你所提到的,我不知道列表中有“复制”对象。

标签: c++ qt memory-leaks


【解决方案1】:

是的,会有内存泄漏。作为一般规则,您的程序中的每个 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 本身没有任何内存管理错误,此版本不会泄漏。


编辑:顺便说一句,您的程序是否:
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

【讨论】:

    【解决方案2】:

    我看不出在您的代码中使用 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; 
    }
    

    【讨论】:

    • 这只是一个示例,我只是想知道在这种情况下如果我们将对象从堆中保留会发生什么,但感谢您的回答...
    • @Arsham:我的回答解决了您的示例(代码)的问题。你认为我还应该谈什么?
    • 也许我的问题没有表达出来。谢谢你的时间:)
    【解决方案3】:

    当 QList 被销毁/超出范围时,它会随之销毁其 内容。在您的情况下,内容由对象的 副本 组成(由隐式复制构造函数构建),而不是对象本身。由于new MyType() 创建的原始对象将丢失其指针,因此内存将在 for 循环的每次迭代中泄漏,但仍将保持分配状态。

    【讨论】:

    • 他的代码创建了QList&lt;MyType&gt;不是 QList&lt;MyType*&gt;。这是否意味着他正在存储项目的副本,而不是指向它们的指针?
    • @Rob :我的错...我通过看到新的 MyType() 假设他正在存储指针,现在正在编辑我的答案...
    • @Rob:我同意。这也是我的错……谢谢你指出这一点。我删除了我的答案。
    【解决方案4】:

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

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

    【讨论】:

    • 他不是在 QList 中存储指针,而是在存储对象。 QList 将负责销毁列表中的项目。
    • @Arsham,我开始认为我不明白你的问题的重点。
    • @Rob:很有趣,我得到了我正在寻找的答案!谢谢队友
    • @Arsham:我开始认为不明白你的问题的重点。
    • @Rob 你说得对,指针没有被存储,但问题是new 会导致泄漏,因为对象永远不会被删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多