私はQLayout
オブジェクトがそのウィジェットの所有権を引き継いでいることをQtのドキュメントで知っています。しかし、QLayout
オブジェクトに関する限り、それをスタック上に作成してからsetLayout
関数を使用してウィジェットに渡すことは安全ですか?または、ヒープ上に作成する必要がありますか?スタックにQLayoutを作成しても安全ですか?
#include <iostream>
#include <QtGui/QApplication>
#include <QPushButton>
#include <QVBoxLayout>
class LoudPushButton : public QPushButton
{
public:
virtual ~LoudPushButton(){std::cout << "~LoudPushButton()" << std::endl;}
};
class LoudQVBoxLayout : public QVBoxLayout
{
public:
virtual ~LoudQVBoxLayout(){std::cout << "~LoudQVBoxLayout()" << std::endl;}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget window;
// On the heap
LoudQVBoxLayout* mainlayout = new LoudQVBoxLayout;
mainlayout->addWidget(new LoudPushButton);
mainlayout->addWidget(new LoudPushButton);
window.setLayout(mainlayout);
/*
// On the stack
LoudQVBoxLayout mainlayout;
mainlayout.addWidget(new LoudPushButton);
mainlayout.addWidget(new LoudPushButton);
window.setLayout(&mainlayout);
*/
window.show();
return a.exec();
}
両方の選択肢//スタック上と//ヒープ上の出口で同じ結果を生成:
~LoudQVBoxLayout()
~LoudPushButton()
~LoudPushButton()
しかし、私は、これは未定義の動作ではないことを確認することができますか? window
はdelete
というレイアウトで呼び出されますか?
EDIT:
LoudPushButton button;
mainlayout->addWidget(&button);
mainlayout->addWidget(new LoudPushButton);
がbutton
と*mainlayout
を同時に削除することが保証されている場合でも、未定義の動作を生成します:キャットプラスプラスすることによって答えを考慮して
私は推測。これは本当ですか?
私は受け入れられた答えを再考すべきだと思います。私はCat Plus Plusの答えがQtのドキュメンテーションとどのように矛盾しているかを詳しく説明して私の投稿を編集しました。 – cgmb