5

私はあちこちで次のようなQtGUI構文を見てきました:

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);
}

私がボタンの親として与えている「これ」とレイアウトが完全に構築されていないため、子を破壊しない可能性があるため、例外が発生した場合にこれがリークする可能性があるかどうかを常に考えていました。

MSVC2010 Qt4.8.3で試してみましたが、基本QObjectクラスが完全に作成されると(もちろん最初に実行されます)、コンストラクター内の他のオブジェクトに「this」を渡しても問題ないようです。オブジェクトは破棄されます。正しく。

Qtのドキュメントでこれを保証する場所は見つかりませんでしたが、誰かが私にそれを指摘してくれるので、これが将来変更されないことを保証できますか?

4

1 に答える 1

2

派生コンストラクターの前に基本コンストラクターが実行されることを保証するのは標準C++だと思いますが、標準から章と節を引用することはできません。とはいえ、 QObjectのデストラクタが常にそのQObjectの子を破棄するという保証があります。

Qtの規則では、ポインターがQObjectまたはQWidgetコンストラクターに渡されるQObjectが、新しく構築されたオブジェクトの親になります。したがって、のctorに渡すthisと、の子になります。のQObject部分はその時点ですでに構築されているので、その機能を安全に信頼できると思います。buttonbuttonmyDialogmyDialog

編集:上記の例では、コンストラクターbuttonのためにの子として開始されますが、追加されると親が変更され、の孫になります。これは、QObjectデストラクタによって削除される必要があります。myDialoglayoutmyDialog

于 2012-11-16T23:15:30.640 に答える