代码之家  ›  专栏  ›  技术社区  ›  yesraaj

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

qt
  •  6
  • yesraaj  · 技术社区  · 17 年前
    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 回复  |  直到 14 年前
        1
  •  5
  •   mxcl    17 年前

    在您的示例中,quit不必进行堆分配。

    这段代码编译并执行良好:

    struct MyWidget : QWidget 
    {
        QPushButton quit;
    
        MyWidget()
        {
            quit.setGeometry( 62, 40, 75, 30 );
            quit.setFont( QFont( "Times", 18, QFont::Bold ) );
        }
    };
    
        2
  •  2
  •   Caleb Huitt - cjhuitt    17 年前

    如果我正确理解了你的问题,我认为这主要归结为传统和例子,并加入了一点头部依赖。

    当然,另一种选择是宣布 quit MyWidget QPushButton MyWidget QObject s用于跟踪按钮的内存,并在销毁时将其删除,因此不需要将其指定为类中的成员。

        3
  •  0
  •   ypnos    17 年前

        4
  •  -1
  •   Aaron Digulla    17 年前

    还有其他选择吗?从堆栈?Qt如何知道何时从堆栈分配,何时从堆分配?一旦当前函数返回,从堆栈中分配的东西就会消失,因此对象的生存期可能比使用时间短得多。想象一下,在树中添加一个节点。该节点将在当前函数返回后很长时间内使用。这将导致访问随机存储器、分段错误、核心转储等。