QLayout
オブジェクトがそのウィジェットの所有権を前提としていることを Qt のドキュメントから知っています。しかし、オブジェクトに関する限り、スタック上にオブジェクトを作成し、関数QLayout
を使用してウィジェットに渡すことは安全ですか? setLayout
それとも、ヒープ上に作成する必要がありますか?
#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
編集:
Cat Plus Plus による回答を考慮して、次のように推測します。
LoudPushButton button;
mainlayout->addWidget(&button);
mainlayout->addWidget(new LoudPushButton);
button
と*mainlayout
が同時に削除されることが保証されている場合でも、未定義の動作が発生します。これは本当ですか?