Создание и освобождение объекта виджета Qt - PullRequest
7 голосов
/ 24 ноября 2010

Я слышал, что виджеты должны размещаться в куче (используя new), и тогда нет необходимости их удалять (это делается автоматически).

  1. Может кто-нибудь объяснить, почему?
  2. Что произойдет, если виджет размещен не таким образом, а в стеке?

Я не уверен, имеет ли это значение, но у всех создаваемых виджетов есть родитель.

Это говорит:

Если parent равен 0, новый виджет становится окно. Если родитель это другой виджет, этот виджет становится дочерним окном внутри родителя. Новый виджет удаляется при удалении его родителя.

Ответы [ 2 ]

21 голосов
/ 24 ноября 2010

В этом нет никакой магии. Проще говоря, QObject автоматически удаляет своих потомков в своем деструкторе. Так что, пока у вашего виджета есть родитель и вы уничтожаете его, вам не нужно беспокоиться о детях. Так что, если вам интересно, что это был за параметр QObject * parent, то вот для чего он нужен.

Также из документа:

Все дочерние объекты удалены. Если какой-либо из этих объектов находится в стеке или является глобальным, рано или поздно ваша программа потерпит крах.

Итак, не давайте родительских объектов объектам, которые выделены в стеке.

3 голосов
/ 24 ноября 2010

Документы по этому вопросу здесь .Причина, по которой они чаще всего выделяются в куче, состоит в том, чтобы избежать проблем, вызванных порядком построения элементов дерева объектов.Стек хорош, если вы следуете правилам, но зачем беспокоиться, когда у вас есть надежная альтернатива?

Ссылка, на которую ссылается @Etienne, здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...