Russian Qt Forum

Qt => Вопросы новичков => Тема начата: foufou от Март 17, 2012, 14:31



Название: утечка памяти: QVector::clear
Отправлено: foufou от Март 17, 2012, 14:31
Разбираю чужую программу, в которой происходит большая утечка памяти. Обнаружил одно подозрительное место.

Имеется такой класс:

class MyClass
{
public:
    MyClass();
    ~MyClass();
...
private:
   QVector<OtherClass* > vec;
...
}

Деструктор этого класса MyClass выглядит таким образом:

MyClass::~MyClass
{
    vec.clear();
}

Что-то мне кажется, что такой деструктор приведет к утечке памяти. QVector содержит в себе указатели на экземпляры класса OtherClass. Простое очищение вектора vec едва ли приведет к освобождению памяти - скорее это приведет к мусору, который к тому же будет накапливаться по мере работы программы. Действительно ли это так ? Просто я слышал, что QVector "умнее" обычного стл-вского vector.
Если утечка все же имеет место, то как правильно освобождать память в деструкторе ?


Название: Re: утечка памяти: QVector::clear
Отправлено: BRE от Март 17, 2012, 14:39
Если утечка все же имеет место
Утечка будет, если эти же объекты не освобождаются где нибудь еще.

как правильно освобождать память в деструкторе ?
Пройтись циклом по всему вектору и освободить все объекты или воспользоваться qDeleteAll.


Название: Re: утечка памяти: QVector::clear
Отправлено: foufou от Март 17, 2012, 15:31
Спасибо !

Попробовал и так и сяк:

MyClass::~MyClass()
{
    for (int i = 0; i < vec.count(); i++) delete vec(i);
    vec.clear();
}

MyClass::~MyClass()
{
    qDeleteAll(vec);
    vec.clear();
}

Вроде работает.