Согласно документации Qt:
QObjects организуются в деревья объектов. Когда вы создаете
QObject с другим объектом в качестве родителя, объект будет автоматически
добавить себя в список дочерних () родителей. Родитель становится владельцем
объекта; то есть он автоматически удалит своих потомков в своем
деструктор.
Для меня это означает, что когда QObject удаляется, он проходит и вызывает delete во всех указателях, которые он хранит в своем дочернем списке.
Тем не менее, нет необходимости для динамического размещения дочерних элементов, и вполне законно строить деревья QObject с объектами, выделенными из стека.
Согласно стандартным спецификациям, вызов delete для указателя, который не указывает на динамически размещенный объект, является неопределенным поведением, которое может привести к чему угодно, от «ничего» до сбоя программы.
IMO маловероятно, что QObject, который в значительной степени является основой почти всей коллекции классов Qt, полагается на то, что может привести к неопределенному поведению.
Итак, различает ли QObject дочерние элементы стека и кучи при удалении? И если да, то как именно?
Тем не менее, нет необходимости для детей динамически распределяться,
и вполне законно строить деревья QObject с выделенным стеком
объекты.
Не виделись QObject :: ~ QObject ():
Предупреждение: Все дочерние объекты удаляются. Если какой-либо из этих объектов включен
стек или глобальный, рано или поздно ваша программа потерпит крах.
Других решений пока нет …