2014-10-22 4 views
1

Во многих учебных пособий Qt, я вижу, что люди делают это, чтобы добавить в спейсер в панели инструментов или строке состояния:Добавить пустой пробел Виджет вызывает утечку памяти в Qt?

tb = my_toolbar; 
QWidget* empty = new QWidget(); 
empty->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Preferred); 
tb->addWidget(empty); 
tb->addWidget(otherWidget); 

И они никогда не делают:

delete empty 

в любом месте. Разве это не утечка памяти? Почему многие люди все еще так делают?

ответ

1

справа от documentation:

QAction * QToolBar :: addWidget (QWidget * виджет)

Добавляет данный виджет на панель инструментов в качестве последнего элемента на панели инструментов.

Панель инструментов принимает виджет.

Таким образом, предположение And they never do: неверно. Виджет будет автоматически разрушен the parent/child hierarchy mechanism, поддерживаемый в Qt. Здесь вы можете найти суть:

Когда объекты QObject создаются в куче (то есть, созданный с новым), дерево может быть построено из них в любом порядке, а затем, объекты в дереве могут быть уничтожены в любом порядке. Когда любой объект QObject в дереве удаляется, если объект имеет родительский объект, деструктор автоматически удаляет объект из своего родителя. Если у объекта есть дети, деструктор автоматически удаляет каждого ребенка. Нет QObject удаляется дважды, независимо от порядка уничтожения.

2

№ Виджет становится дочерним элементом панели инструментов и удаляется его родителем при уничтожении родителя.