Управление памятью Qt Widget - PullRequest
3 голосов
/ 03 ноября 2011

Так что я немного запутался в управлении памятью в Qt. Я смотрел на начальные образцы и учебники и увидел это

 QApplication app(argc, argv);
 QWidget window;
 QLabel *label = new QLabel(QApplication::translate("windowlayout", "Name:"));
 QLineEdit *lineEdit = new QLineEdit();

 QHBoxLayout *layout = new QHBoxLayout();
 layout->addWidget(label);
 layout->addWidget(lineEdit);
 window.setLayout(layout);
 window.setWindowTitle(
     QApplication::translate("windowlayout", "Window layout"));
 window.show();
 return app.exec();

Это нормально, за исключением того, что я не вижу освобождения памяти при создании новых виджетов, теперь это только для учебника, чтобы они не смущали людей, или управление памятью обрабатывается автоматически Qt. Потому что, глядя на это, я должен был поверить, что произошла утечка памяти, потому что ничего не освободилось.

Ответы [ 3 ]

9 голосов
/ 03 ноября 2011

Виджеты уничтожаются их родителями (например, когда вы вызываете layout->addWidget, макет становится владельцем переданного виджета), когда они уничтожаются. В вашем случае window будет уничтожено в конце области (когда возвращается app.exec), что, в свою очередь, уничтожит макет, что, в свою очередь, уничтожит метку и поле редактирования.

Деревья объектов и права собственности в Qt docs.

0 голосов
/ 03 ноября 2011

Qt строит внутреннее дерево вещей (макеты, виджеты, диалоги, ...), которые освобождаются, когда Qt считает, что это нормально. Эта иерархия строится с родительским параметром в конструкторе «вещей» или всякий раз, когда ответственность передается каким-либо другим вызовом функции (например, addWidget). Так что вам даже не разрешено удалять «вещи», когда Qt или какой-то виджет взял на себя ответственность. Смотрите документы в Qt по этому вопросу.

0 голосов
/ 03 ноября 2011

В Qt объекты освобождаются на основе иерархии. т.е. когда QObject освобожден, все его дочерние элементы будут освобождены (на основе родителей, переданных в качестве аргументов в конструктор объекта).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...