Итак, я узнал, что Qt освобождает память всех дочерних объектов, когда родительский объект удаляется. Кроме того, обычно не нужно заботиться об управлении памятью для объектов, созданных в стеке (т.е. НЕ в качестве указателей).
Теперь, когда я сделал очень хороший руководство "Адресная книга", Я нашел это в части 5:
AddressBook::AddressBook(QWidget *parent) : QWidget(parent)
{
dialog = new FindDialog;
}
Доступен полный исходный код: addressbook.h
addressbook.cpp
finddialog.h
Здесь dialog
является частным членом AddressBook
и является указателем на FindDialog
. FindDialog
наследует QDialog
, но конструктору не передается this
-Pointer (как показано выше). Явного деструктора не существует, delete dialog
-вызова нет...
Кроме того, непрохождение this
кажется преднамеренным:
Конструктор [FindDialog] определен для приема родительского QWidget, даже если диалоговое окно будет открыто как отдельное окно.
Не приведет ли это к утечке памяти? Или есть какой-то другой механизм, который молча удалит dialog
и освободит его память?
Заранее благодарю за любую помощь!
Обновление: я разместил эту проблему на форумах qt-project.org и это скоро должно быть исправлено.
Q_OBJECT
не происходит настоящего волшебства. Вы можете убедиться в этом с уверенностью, используя valgrind. Однако это не имеет значения, так какAddressBook
длится все время жизни приложения. Тем не менее, в учебнике он должен был быть освобожден именно для того, чтобы не вызывать таких проблем, как у вас. - person Matt Phillips   schedule 21.04.2014AddressBook
длится только время жизни приложения, не влияет наdialog
, не так ли? Было бы, если бы он был создан в стеке, но не в этом случае... - person Alex K   schedule 21.04.2014AddressBook
уничтожается только тогда, когда приложение завершает работу, и в этот момент вся связанная с ним память, включаяdialog
, освобождается. Таким образом, утечки памяти удается избежать, но стилистически плохо и не масштабируемо. - person Matt Phillips   schedule 21.04.2014FindDialog dialog
. Тогда вам не нужно явно выделять или создавать его, и он не может протекать. Здесь вообще нет веской причины использовать указатель. - person Kuba hasn't forgotten Monica   schedule 21.04.2014FindDialog
освобождается при закрытии (модального?) диалогового окна... - person Massa   schedule 21.04.2014