class MyWidget : public QWidget { public:
MyWidget( QWidget *parent=0, const char *name=0 ); };
MyWidget::MyWidget( QWidget *parent, const char *name )
: QWidget( parent, name ) {
QPushButton *quit = new QPushButton( "Quit", this, "quit" );
quit->setGeometry( 62, 40, 75, 30 );
quit->setFont( QFont( "Times", 18, QFont::Bold ) );
}
在上面的代码中quit
在Heap中分配,因为它是MyWidget的子代,所以它是必要的
为什么Qt需要在堆中分配子对象?
答案 0 :(得分:5)
在你的例子中,quit不必是堆分配的。
此代码编译并执行正常:
struct MyWidget : QWidget
{
QPushButton quit;
MyWidget()
{
quit.setGeometry( 62, 40, 75, 30 );
quit.setFont( QFont( "Times", 18, QFont::Bold ) );
}
};
答案 1 :(得分:2)
如果我理解你正确提出的问题,我认为它主要归结为传统和例子,并引入了一些头部依赖性。
当然,另一种方法是将quit
声明为MyWidget
的成员变量。如果这样做,那么您需要在QPushButton
中包含声明MyWidget
的头文件,而不是在实现文件中。您提供的示例还依赖于QObject
的父关系来跟踪按钮的内存,并在销毁时删除它,因此不需要将其指定为类中的成员。
如果你真的想要,我很确定你可以改成堆栈分配。
答案 2 :(得分:0)
我认为这里的想法是Qt有自己的内部引用计数在大多数对象上,如果你传递它们,使用copy-on-write等。
你能在问题上更具体一点吗?
答案 3 :(得分:-1)
还有哪些其他选择?从堆栈? Qt如何知道何时从堆栈中分配以及何时从堆中分配?一旦当前函数返回,从堆栈分配的东西就会消失,因此对象的生命周期可能比使用时间短得多。想象一下,将一个节点添加到树中。当前函数返回后很久就会使用该节点。这将导致访问随机内存,分段错误,核心转储等。