Я использую Qt 5.7 с C++ в Visual Studio Community 2015. Что я знаю об управлении ресурсами Qt, так это то, что когда вы убиваете родителя, вам не нужно уничтожать дочерние указатели на этот родительский объект. Однако, когда я пытался, я не получил результатов, указывающих на это направление, и я не понимаю, почему.
Я запускаю код ниже, чтобы получить контрольную точку. Обратите внимание на закомментированный блок кода:
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* w0 = new QWidget;
/*
QWidget* w1 = new QWidget;
w1->setWindowTitle("Window 1");
for(size_t i = 0; i < 1000; i++) {
QPushButton* pb = new QPushButton(w1);
}
w1->show();
*/
w0->show();
return a.exec();
}
При выполнении этого кода VS говорит, что память процесса составляет 4 МБ.
И затем я запускаю код ниже, чтобы использовать больше памяти. Тот же код без блока комментариев:
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* w0 = new QWidget;
QWidget* w1 = new QWidget;
w1->setWindowTitle("Window 1");
for(size_t i = 0; i < 1000; i++) {
QPushButton* pb = new QPushButton(w1);
}
w1->show();
w0->show();
return a.exec();
}
На этот раз он использовал 9 МБ памяти.
Все идет нормально. Теперь я ожидаю, что когда я уничтожу w1, он должен вернуть ресурсы, используемые его дочерними объектами (кнопками), и я должен увидеть уменьшение используемой памяти. Но этого не происходит. Я убиваю w1, и w0 все еще работает, поэтому я все еще могу наблюдать за использованием памяти, w0 не является родителем w1, все кнопки являются дочерними для w1, но память не возвращается. Что я делаю/понимаю неправильно?
Обновление: в приведенных выше примерах я просто закрываю (нажмите X вверху) окно, на которое указывает w1, я думаю, что он также удалит указатель w1, но для проверки я запустил приведенный ниже код, и этот код использует 6 МБ объем памяти. Так что видимо 3 МБ возвращается после добавления
delete w1;
Новый код ниже:
#include <QtWidgets/QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
QWidget* w0 = new QWidget;
QWidget* w1 = new QWidget;
w1->setWindowTitle("Window 1");
for(size_t i = 0; i < 1000; i++) {
QPushButton* pb = new QPushButton(w1);
}
w1->show();
w0->show();
delete w1;
return a.exec();
}
но все еще есть утечка 2 МБ. На данный момент два вопроса:
1. Почему я должен явно удалять w1? Почему закрыть окно недостаточно? 2. Почему утечка сохраняется даже после явного удаления w1?
w0
иw1
? Вы не показываете это в своем коде. - person Mike   schedule 16.12.2016delete w1;
нижеw0->show();
, и теперь используемая память составляет 6 МБ, что все еще не 4 МБ. Так что, видимо, да, есть разница, когда я сам удаляю указатель, но он все еще кажется утечкой, и я думаю, что закрытия окна должно быть достаточно, чтобы вернуть использованную память. - person Deniz   schedule 16.12.2016WA_DeleteOnClose
. Вы установили это? - person Mike   schedule 16.12.2016delete w1;
, которого, я думаю, должно быть достаточно, чтобы получить 5 МБ, используемые w1. Но я все еще получаю утечку 2 МБ даже после этого удаления. - person Deniz   schedule 16.12.2016#include <QtWidgets>
без каких-либо других включений. Кроме того, форма#include <QtModule/QClass>
неверна, так как скрывает неверную конфигурацию проекта до времени компоновки. Используйте#include <QClass>
. Если компилятор жалуется на отсутствие включаемого файла, то вы знаете, что должны проверить файл.pro
на наличие правильных модулей, а затем повторно запустить qmake в проекте. - person Kuba hasn't forgotten Monica   schedule 19.12.2016