Russian Qt Forum
Ноябрь 26, 2024, 19:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Очиска памяти  (Прочитано 1931 раз)
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();
}
Вопрос: можно ли организовать перезапуск главной формы, с полной очисткой памяти?
Записан
carrygun
Гость
« Ответ #1 : Декабрь 16, 2013, 12:28 »

Ну например при создании *m_t положить *m_t в QMap, а в нужный момент пробежаться по всем элементам Кумапа и удалить их.
Записан
mevn
Гость
« Ответ #2 : Декабрь 16, 2013, 12:35 »

Ну например при создании *m_t положить *m_t в QMap, а в нужный момент пробежаться по всем элементам Кумапа и удалить их.
Спасибо.
Но это тестовый пример, для проверки. На самом деле, данная процедура нужна, потому что найти где создавался *m_t не представляется возможным. Нужно либо полностью перезапустить приложение, либо каким-то образом очистить все подобные *m_t.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Декабрь 16, 2013, 12:50 »

Такой возможности нет в языке, решается инструментами отладки. Впрочем "сборщики мусора" (которыми так хвалятся др языки) могут и не помочь т.к. ссылки на неудаленный объект возможны. Если хорошего инструмента нет, можно перекрыть new/delete. Для начала неплохо попечатать счетчики подозрительных объектов
Записан
Bepec
Гость
« Ответ #4 : Декабрь 16, 2013, 13:44 »

Самое простое, если не можете найти место - использовать синглтон со списком указателей на ваши классы.

И в конструкторе класса помещать указатели в список,а в деструкторе удалять. Все оставшиеся в списке объекты нужно будет удалить принудительно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.242 секунд. Запросов: 22.