как Qt удалить QObjects? - PullRequest
0 голосов
/ 07 июня 2018

Как я понимаю, следующий код является прекрасным способом создания QObject

QLabel *label = new QLabel("label");
QWidget window;
label->setParent(&window);
window.show();

Поскольку я читаю везде"родительский объект становится владельцем вновь созданного объекта -и в конце концов вызывает delete ", или" составной объект становится владельцем дочерних объектов, поэтому, пока родительские функции выполнены, вы можете быть уверены, что дочерние объекты QObject будут уничтожены при уничтожении родительского объекта "(из КакQt удаляет объекты? И как лучше всего хранить QObjects? )

Может кто-нибудь сказать мне, как Qt может "взять на себя ответственность" за QObject?Более технически: как Qt (которая является библиотекой и имеет собственную среду выполнения) может вызывать оператор delete для указателя, который я создал с оператором new из другой среды выполнения?Почему не происходит сбой?

РЕДАКТИРОВАТЬ

Я добавляю эту ссылку, поскольку весь смысл вопроса заключается в следующем:

"Theкод, выполняющийся в DLL, может использовать другую библиотеку времени выполнения C ++, что означает, что компоновка кучи будет отличаться. DLL может вообще использовать другую кучу.

Вызов delete (в основной программе)указатель, выделенный библиотекой DLL (или наоборот), приведет к (в лучшем случае) немедленному падению или (в худшем случае) повреждению памяти, для отслеживания которого потребуется некоторое время ».(из C ++ mix new / delete между библиотеками? )

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Пусть исходный код говорит вместо простых ответов.Вот что делают внутренности QObject :

for (int i = 0; i < children.count(); ++i) {
    currentChildBeingDeleted = children.at(i);
    children[i] = 0;
    delete currentChildBeingDeleted;
}
children.clear();

Функция с кодом выше вызывается в деструкторе.Так что все довольно просто.Родитель хранит указатели на всех своих детей.Когда вызывается деструктор родителя, он удаляет все его потомки.Это рекурсивно, так как вызов delete для объекта вызывает его деструктор

Почему Qt может безопасно удалить без забот о библиотеке времени выполнения

На самом деле, из-за искажения имени, экспорт интерфейса C ++ почти заставляет васиспользуйте одну и ту же версию компилятора и библиотеки времени выполнения.Это очень грубо позволяет Qt предположить, что delete безопасно для вызова.

0 голосов
/ 07 июня 2018

для Qt (которая является библиотекой и имеет собственную среду выполнения)

Здесь ваше предположение неверно.Во-первых, для ОС не существует понятия «время выполнения».«Время выполнения» - это информационный термин.

В современных операционных системах есть такие вещи, как: исполняемый двоичный файл, разделяемые библиотеки или динамически связанные библиотеки, такие как DLL, статические библиотеки, процессы, потоки и т. Д.

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

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