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

BЈо*_*вић 7 c++ qt memory-management

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

  1. 有人可以解释原因吗?
  2. 如果窗口小部件没有以这种方式分配,但在堆栈上会发生什么?

我不确定它是否重要,但我创建的所有小部件都有一个父级.

说:

如果parent为0,则新窗口小部件将成为窗口.如果parent是另一个小部件,则此小部件将成为父级内的子窗口.删除其父窗口时将删除新窗口小部件.

Eti*_*tel 21

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

另外,来自doc:

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

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

  • 只需查看QObject析构函数的文档:http://doc.trolltech.com/4.7/qobject.html#dtor.QObject (3认同)

Ste*_*end 5

这方面的文档在这里。它们最常分配在堆上的原因是为了避免由对象树成员的构造顺序引起的问题。只要您遵守规则,堆栈就很好,但是当您有可靠的替代方案时,何必费心呢?

引用的@Etienne 参考在这里