「現代のC++」Qtアプリケーションは、できるだけ多くのRAIIを使用しています。ときに、このような可能自動割り当てを使用しても安全であればそこで私は自分自身に尋ねる:Qtに所有権の有無がありますか
#include <QApplication>
#include <QtWidgets>
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Der eine Knopf");
QPushButton button{"Ende"};
QObject::connect(&button, SIGNAL(clicked()), &app, SLOT(quit()));
QVBoxLayout layout{};
layout.addWidget(&button);
window.setLayout(&layout);
window.show();
return app.exec();
}
元チュートリアルコードのに対しポインタとヒープの多くを持っていた:
#include <QApplication>
#include <QtWidgets>
int main(int argc, char **argv) {
QApplication app{argc, argv};
QWidget window{};
window.setWindowTitle("Hallo Qt");
QPushButton button = new QPushButton("Ende");
QObject::connect(button, SIGNAL(clicked()),
&app, SLOT(quit()));
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button);
window.setLayout(layout);
window.show();
return app.exec();
}
私はQtの所有権を認識してい一般的にQObject
の概念。だから私は2番目の例が正しいと仮定します。私はsetLayout
とaddWidget
も所有権を変更すると仮定しているので、明示的なdelete
はクライアントとして私に必要です。
私が疑問に思うと仮定すると、なぜ私の最初の例はそれで動作しますか?これらのメソッドが所有権を取得する場合、最後に新たに取得した子どもはdelete
になりませんか?もしそうなら、オブジェクトが2回削除されるので私のプログラムはクラッシュしませんか?しかし、それは偶然ではありますか?)
誰が誰を所有しているのか、どのように機能しているのか分かりません。私が聞いた1つのルールは、 "Qtはそれを世話します" - しかし、 "何のこと?"そして、何ではないのですか?
もちろん、私はQtの新機能ですが、QObject
のコンストラクタとデストラクタの数についていくつかの洞察があります。または、建設や破壊のそれぞれのメッセージ。そのような施設はQtにありますか?
あなたのアプリがクラッシュしていないという事実は偶然であると私は信じています。これは、 'QObjects'がデストラクタの親のオブジェクトツリーから自分自身を削除するためです。スタック上であなたのウィジェットの構築順序を変更する場合、親が子の前に破壊されると、子を削除しようとしますが、その子はスタック上に作成されたので、SEGV –
[オブジェクトツリーと所有権](http://doc.qt.io/qt-5/objecttrees.html)を参照してください。 – thuga
@SteveLorimerは "親の木から自分自身を取り除く" ...そうです...それはうまくいくかもしれません。あなたは...私はthugaからのリンクを介してこれを読み上げます。 – towi