Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] Ошибка при WA_DeleteOnClose, Объясните почему вылетает ошибка памяти 
V
    Опции темы
null56
Дата 26.11.2008, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Сразу скажу, что я лишь начинаю разбираться в qt4

Приведу пример кода методов....

Конструктора
Код

MainWindow :: MainWindow()
{
    setAttribute(Qt::WA_DeleteOnClose);
    createActions();
    createMenus();
    createToolBars();
}


Метода настроек двух кнопок
Код

    mpCloseAction = new QAction(tr("Close"), this);
    connect(mpCloseAction, SIGNAL(triggered()), this, SLOT(close()));

    mpExitAction = new QAction(tr("Exit"), this);
    mpExitAction->setStatusTip(tr("Exit etable"));
    mpExitAction->setShortcut(tr("Ctrl+Q"));
    connect(mpExitAction, SIGNAL(triggered()), qApp, SLOT(closeAllWindows()));


Метода создающего новое окно
Код

void MainWindow :: newFile()
{
    MainWindow * p_main_window = new MainWindow;
    p_main_window->show();
}


И метода при выходе
Код

void MainWindow :: closeEvent(QCloseEvent * pEvent)
{
    pEvent->accept();
}


Окна, которые были созданы методов newFile, закрываются нормально, но перначально созданное окно, вылетает с ошибкой.... 
Если убрать setAttribute(Qt::WA_DeleteOnClose);, то все работает, как и задумано...

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

Вопросы:
1) я правильно понял назначение данного метода?
2) Почему же у меня ошибка.. при том пишет, что указатель, итпа не актуальный....
3) Нужно ли следить за вновь созданными объектами, чтобы своевременно их почистить?

Заранее благодарен за помощь...

Добавлено через 4 минуты
Нашел ошибку... В основном приложении я создавал статический объект первоначально созданного окна, и qt повторно пытался его удалить... создал динамически и все нормально заработало...
Извините за лишнюю тему на форме....
PM MAIL   Вверх
null56
Дата 26.11.2008, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Единственное, что хотел уточнить, действительно ли qt следит за всеми динамически созданными объектами - виджетами? и при необходимости может их удалять при закрытие окна?
PM MAIL   Вверх
SABROG
Дата 26.11.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(null56 @ 26.11.2008,  15:30)
Единственное, что хотел уточнить, действительно ли qt следит за всеми динамически созданными объектами - виджетами? и при необходимости может их удалять при закрытие окна?

Только на базе QObject'a и только, если у объекта есть родитель. По сути это обычное дерево, где корень - главное окно, а контролы на нем - дети. Если удалять родительское окно, то в деструкторе сначала удаляются все дочерние элементы, а они уже по цепочке удаляют своих детей, пока ничего не останется. Если в конструктор объекта не передается указатель на родителя, то объект считается родителем и его удалять надо вручную или поставить флаг, чтобы оно удалялось при событии onClose.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
null56
Дата 26.11.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



А реализовать это ручками, как будет выглядеть?

Я не совсем правильно выразился....

если мы создаем объект динамически, которого никто удалять не собирается, то мы должны всегда хранить указатель на него, чтобы потом сделать delete этого указателя?

Получается так? это единственный способ устранения утечки?

Это сообщение отредактировал(а) null56 - 26.11.2008, 16:25
PM MAIL   Вверх
Elfebet
Дата 26.11.2008, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

Репутация: 5
Всего: 14



Цитата

если мы создаем объект динамически, которого никто удалять не собирается, то мы должны всегда хранить указатель на него, чтобы потом сделать delete этого указателя?


нет, если этот обьект дочерний от QWidget или QObject - то в ручную можна и не удалять
пример
Код

QPushButton *btn = new QPushButton(this) // обьект сам удалиться
QPushButton *btn = new QPushButton(0) // в этом случае может и не удалиться


пример может быть и корявый, но из слов SABROG - я так понял


хм.... да, пример корявый у QPushButton в любом случае будут родители, но суть я думаю ты понял

Это сообщение отредактировал(а) Elfebet - 26.11.2008, 17:39


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
SABROG
Дата 26.11.2008, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Hacker
****


Профиль
Группа: Завсегдатай
Сообщений: 2481
Регистрация: 18.9.2006

Репутация: 81
Всего: 91



Цитата(Elfebet @  26.11.2008,  17:35 Найти цитируемый пост)
хм.... да, пример корявый у QPushButton в любом случае будут родители


Если родитель в QPushButton не передается в конструктор, то он по-умолчанию 0.

Самый первый пример, который все видят при изучении Qt (hello, world): http://doc.trolltech.com/4.4/linguist-hellotr.html

Тут класс QPushButton является главным окном. В принципе все-равно какой контрол используется как главное окно, если он на базе QWidget.


--------------------
Национальная группа Russian Federation на QtCentre.
PM MAIL   Вверх
JackYF
Дата 26.11.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 7
Всего: 162



Метод, создающий новое окно, весьма странен.

Добавлено через 11 секунд
Хотя, не факт.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0460 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.