为什么Qt需要在堆中分配子对象?

时间:2009-02-25 12:32:35

标签: qt

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需要在堆中分配子对象?

4 个答案:

答案 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如何知道何时从堆栈中分配以及何时从堆中分配?一旦当前函数返回,从堆栈分配的东西就会消失,因此对象的生命周期可能比使用时间短得多。想象一下,将一个节点添加到树中。当前函数返回后很久就会使用该节点。这将导致访问随机内存,分段错误,核心转储等。