Если только он не находится на самом верхнем уровне (например, в main
, когда вы создаете свое начальное окно), вы действительно не должны этого делать.
Основная причина c в том, что Qt просто не предназначен для автоматических c объектов. Qt разработан для динамического выделения c и управления вашей памятью, нарушение которого может привести к неприятным результатам. Тот, который сразу приходит на ум, - это порядок разрушения для автоматических c объектов, автоматические c объекты разрушаются в обратном порядке их построения. Так что же происходит в такой ситуации?
...
QLabel lbl("Hello world");
QWidget win;
lbl.setParent(&win);
...
Ответ не симпатичен. Когда эти объекты будут уничтожены, сначала будет уничтожен win
, и он вызовет деструктор lbl
, к сожалению, lbl
является автоматическим c объектом (что означает, что его удаление вручную - неопределенное поведение); он будет должным образом уничтожен после win
, но к тому времени уже слишком поздно. Это только один пример, но он освещает некоторые странные ошибки, которые могут возникнуть, если вы нарушите предположение Qt, что он управляет вашей памятью за вас.
В целом минимальные накладные расходы при динамическом c распределении памяти по сравнению с автоматическим c распределением стоят того, чтобы предотвратить сложные и странные ошибки, подобные описанным выше. IMO, вы должны всегда позволить Qt управлять вашей памятью за вас, потому что это так, как это было задумано, и то, как предполагается, что вы будете ее использовать.