Russian Qt Forum

Qt => Вопросы новичков => Тема начата: mevn от Декабрь 16, 2013, 06:16



Название: Очиска памяти
Отправлено: mevn от Декабрь 16, 2013, 06:16
Добрый день.
Столкнулся с проблемой. Имеется главная форма. На ней три кнопки.
При нажатии на первую происходит выход из программы. При нажатии на вторую - перезапуск программы. При нажатии на третью - открывается новая форма (при создании новой формы специально допущена ошибка: при закрытии данной формы, выделенная для нее память не очищается)
Код:
#include "test_connect.h"

#include <QtGui>
#include <QApplication>
int param;
int main(int argc, char *argv[])
{
param = 1;

QApplication a(argc, argv);
while (param)
{

test_connect *w = new test_connect;
            w->show();
            a.exec();   
            w->close();
            w->deleteLater();
            a.closeAllWindows();
}
return 1;

}
Код:
#include "test_connect.h"
#include "mem_test.h"
extern int param;
test_connect::test_connect(QWidget *parent)
    : QWidget(parent)
{
ui.setupUi(this);
connect(ui.pushButton, SIGNAL(clicked()),this,SLOT(exit_0()));
connect(ui.pushButton_2, SIGNAL(clicked()),this,SLOT(exit_1()));
connect(ui.pushButton_3, SIGNAL(clicked()),this,SLOT(add_memory()));

}

test_connect::~test_connect()
{

}

void test_connect::exit_0()
{
param = 0;
QApplication::quit();
}
void test_connect::exit_1()
{

QApplication::quit();
}

void test_connect::add_memory()
{
mem_test *m_t = new mem_test;
m_t->show();
}
Вопрос: можно ли организовать перезапуск главной формы, с полной очисткой памяти?


Название: Re: Очиска памяти
Отправлено: carrygun от Декабрь 16, 2013, 12:28
Ну например при создании *m_t положить *m_t в QMap, а в нужный момент пробежаться по всем элементам Кумапа и удалить их.


Название: Re: Очиска памяти
Отправлено: mevn от Декабрь 16, 2013, 12:35
Ну например при создании *m_t положить *m_t в QMap, а в нужный момент пробежаться по всем элементам Кумапа и удалить их.
Спасибо.
Но это тестовый пример, для проверки. На самом деле, данная процедура нужна, потому что найти где создавался *m_t не представляется возможным. Нужно либо полностью перезапустить приложение, либо каким-то образом очистить все подобные *m_t.


Название: Re: Очиска памяти
Отправлено: Igors от Декабрь 16, 2013, 12:50
Такой возможности нет в языке, решается инструментами отладки. Впрочем "сборщики мусора" (которыми так хвалятся др языки) могут и не помочь т.к. ссылки на неудаленный объект возможны. Если хорошего инструмента нет, можно перекрыть new/delete. Для начала неплохо попечатать счетчики подозрительных объектов


Название: Re: Очиска памяти
Отправлено: Bepec от Декабрь 16, 2013, 13:44
Самое простое, если не можете найти место - использовать синглтон со списком указателей на ваши классы.

И в конструкторе класса помещать указатели в список,а в деструкторе удалять. Все оставшиеся в списке объекты нужно будет удалить принудительно.