Преимущества и недостатки создания компонентов QObjects в стеке вместо их динамического создания - PullRequest
0 голосов
/ 14 апреля 2020

Есть ли какие-либо проблемы, если я размещу объекты QObject в стеке, чтобы избежать проблем с управлением памятью? Стоит ли отдавать предпочтение динамически выделенным объектам QObjects c и делегировать управление памятью деревьями объектов qt и механизмом его владения?

1 Ответ

0 голосов
/ 14 апреля 2020

Если только он не находится на самом верхнем уровне (например, в 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 управлять вашей памятью за вас, потому что это так, как это было задумано, и то, как предполагается, что вы будете ее использовать.

...