Должен ли проводить уроки не-Qobject Classe «всегда» на стек?

StackOverflow https://stackoverflow.com/questions/3412579

Вопрос

Исходя из Мира Symbian, я привык использовать кучу как можно больше, чтобы избежать выхода из стекового пространства, особенно при работе дескрипторов. Полученные классы CBASE всегда были динамически выделены на кучу, поскольку если они не были, их переменные члена останутся неинициализированными. Принимается ли одна и та же соглашение на полученные Qobject классы?

В квартале, кажется, распространено, например, QString, на стеке. Являются ли содержание строки на кучу, в то время как QString действует как контейнер на стеке, или все наносится на стек?

Это было полезно?

Решение

Как сказал SJE397: это идиоматично ставить QString И контейнеры на стеке, поскольку они неявно поделились. Их внутренние органы (Pimpl IDIOM «D» указатель) создаются на куче. Нет смысла создавать себе объект на куче тоже. Просто вызывает хлопоты Management Management, и вы теряете предполагаемые свойства копирования в записи при прохождении указателей на строки / контейнеры.

QObjects С другой стороны, вы хотите создать на куче почти во всех случаях, как иначе они будут разрушены снова сразу. Они не могут быть скопированы или назначены (ну, можно обеспечить его для собственных подклассов, но QObject семантика сломана тогда), и обычно они должны пережить метод организма, в котором они созданы. Исключение QDialog, который часто создается на стеке, а затем QDialog::exec, какие блокировки до закрытия диалогового окна. Но даже это строго говорят небезопасно, поскольку внешние события (RPC вызовы, фоновые операции) могут привести к удалению диалога его родительской (если сам родитель удален) до возврата Exec. Затем наличие диалогового окна, создаваемого в стеке, приведет к двойному удалению при рассмотрении стека -> сбой.

Другие советы

QString, и многие другие классы QT, используют Неявный обмен данными. Отказ Это подразумевает, что память обычно выделяется на куче.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top