我从 Qt 文档中知道该QLayout
对象承担其小部件的所有权。但就对象而言,在堆栈上创建它然后使用该函数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
保证同时被删除,也会产生未定义的行为。这是真的?