创建和取消分配Qt窗口小部件对象

时间:2010-11-24 14:26:39

标签: c++ qt memory-management

我听说小部件应该在堆上分配(使用new),然后就不需要删除它们(它是自动完成的)。

  1. 有人可以解释原因吗?
  2. 如果小部件没有以这种方式分配,但在堆栈上会发生什么?
  3. 我不确定这是否重要,但我创建的所有小部件都有父母。

    This说:

      

    如果parent为0,则新窗口小部件变为   一个窗口。如果父是另一个小部件,   这个小部件成为子窗口   在父母内部。新的小部件是   删除其父项时删除。

2 个答案:

答案 0 :(得分:21)

没有任何魔法。简单地说,QObject会在析构函数中自动删除它的子节点。因此,只要您的窗口小部件具有父窗口并且您销毁该父窗口,您就不必担心这些子窗口。所以如果你想知道那个QObject * parent参数是什么,那就是它的用途。

另外,来自doc:

  
    

删除所有子对象。如果这些对象中的任何一个在堆栈或全局上,则程序迟早会崩溃。

  

因此,避免向父母提供堆栈分配的对象。

答案 1 :(得分:3)

关于此的文档是here。它们最常分配在堆上的原因是为了避免由对象树成员的构造顺序引起的问题。只要您遵守规则,堆栈就可以了,但是当您有可靠的替代方案时,为什么还要费心呢?

引用的@Etienne是here