будет уничтожен (), если конструктор класса, производного от QObject, выбрасывает?

Я повсюду видел синтаксис Qt GUI, подобный следующему:

myDialog::myDialog(QWidget *parent, Qt::WFlags flags):QDialog(parent, flags)
{
QPushButton *button = new QPushButton("&Download", this);
QVBoxLayout *layout = new QVBoxLayout(this);
//something that can throw here
layout ->addWidget(button );
setLayout(layout);
}

Я всегда задавался вопросом, может ли это произойти в случае исключения, потому что «this», которое я даю в качестве родителя для кнопки и макета, не полностью сконструировано, поэтому оно не может уничтожить его потомков.

Я попробовал это в MSVC2010 Qt4.8.3 и похоже, что как только базовый класс QObject полностью создан (что, конечно, делается в первую очередь), можно передать «this» другим объектам в конструкторе, они будут уничтожены правильно.

Хотя я не нашел места в документации по Qt, гарантирующего это, может ли кто-нибудь указать мне на это, так что я уверен, что это не изменится в будущем?

5

Решение

Я считаю, что это стандартный C ++, чтобы гарантировать, что базовый конструктор выполняется до производных конструкторов, хотя я не могу цитировать главу и стих из стандарта. Тем не менее, есть гарантия того, что Деструктор QObject всегда уничтожит всех потомков этого QObject.

Соглашение Qt состоит в том, что QObject, указатель которого передается конструктору QObject или QWidget, станет родителем вновь созданного объекта. Поэтому, когда вы проходите this в buttonCtor, button становится ребенком myDialog, Поскольку часть QObject myDialog будет уже построен в то время, я полагаю, что вы можете смело полагаться на эту функциональность.

РЕДАКТИРОВАТЬ: я должен добавить, что в приведенном выше примере, хотя button начинается как ребенок myDialog из-за конструктора он перерисовывается при добавлении в layout и становится внучкой myDialog, который все еще должен быть удален его деструктором QObject.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]