Вопрос про утечки памяти - PullRequest
1 голос
/ 04 мая 2011
#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 ]

5 голосов
/ 04 мая 2011

Да, будет утечка памяти.Как правило, у вас должен быть один 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 для типов указателей.

3 голосов
/ 04 мая 2011

Я не вижу смысла использовать 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; 
}
1 голос
/ 04 мая 2011

Когда QList уничтожается / выходит из области видимости, он уничтожает вместе с ним содержимое .В вашем случае контент состоит из копий ваших объектов (созданных из неявного конструктора копирования), а не из самих объектов.Утечка памяти происходит в каждой итерации цикла for, поскольку исходный объект, созданный new MyType(), потеряет свой указатель, но останется выделенным.

0 голосов
/ 04 мая 2011

Конечно, будет утечка, если вы не удалите все элементы, созданные с помощью new MyType()!

В деструкторе для QList вам нужно пройти по списку и вызвать delete для каждого из этих элементов.

...