2016-07-03 3 views
4

Я не понимаю, как Qt может удалить все дети QObject без двойного удаления чего-либо, если он был статически распределен.Как Qt обрабатывает выделенные стек объекты

В принципе, если я делаю это обычным способом, это выглядит следующим образом:

QWidget Window(nullptr); 
QPushButton* button = new QPushButton(&Window); 
Window.show(); 
return App.exec(); 
//When app ends, Window gets deleted 
//because it was statically allocated 
//And then, Window deletes button because it's its child. 

Но я могу сделать это без аварии:

QWidget Window(nullptr); 
QPushButton button(&Window); 
Window.show(); 
return App.exec(); 
//When app ends, button then Window get deleted 
//because they were statically allocated 
//And then, Window (should) delete button AGAIN because it's its child, thus crashing 
//the program. But it doesn't. Why ? 

ли Qt знаю, как я создал QPushButton, или я что-то пропустил?

+0

Да, вы пропустили что-то, а именно, что неопределенное поведение не определенно. –

+3

@ н.м .: Ничего неопределенного здесь, насколько я могу судить. –

+1

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

ответ

8

Когда объект QObject уничтожен, он удаляется из своего родителя, если он есть. Поэтому, когда Window уничтожен, он не пытается уничтожить QPushButton, потому что кнопка больше не находится в списке дочерних элементов окна.

Соответствующая документация ниже. В нем также упоминается тот факт, что если порядок объявления объектов не соответствует порядку отношений родителя/ребенка, это может привести к тому, что объект будет уничтожен дважды. Это плохо.

http://doc.qt.io/qt-5/objecttrees.html

+0

Понял. Не исключено, что если я создам кнопку перед окном, то используйте button.setParent (& window), это действительно сбой. Это так ... элегантно: D – bisthebis

+0

@bisthebis «Элегантный» - это не то слово, которое я бы использовал ... смешивание RAII и системы родительской системы QObject просто плохо. Также обратите внимание, что система parent-child работает одинаково плохо в сочетании с интеллектуальными указателями, что очень жалко, поскольку они являются одним из ключевых в современном C++. – rubenvb

+0

@rubenvb: Ну, я должен признать, что это не хорошо для последовательности, но я очень рад, что не должен помещать каждого ребенка в unique_ptr. С другой стороны, когда у меня есть случайный объект без Qt как член моего класса окна, трудно выбрать между использованием unique_ptr или его дочерним элементом окна. Что бы вы предложили для Qt? – bisthebis

Смежные вопросы