в Qt мы используем больше указателей, есть ли преимущества? - PullRequest
2 голосов
/ 17 августа 2010

У меня есть некоторые пояснения относительно программирования на Qt. В Qt большую часть времени мы создаем экземпляр виджета, динамически выделяя память.

есть ли какие-либо преимущества в том, чтобы делать это с точки зрения Qt? а как насчет освобождения памяти для виджета? нам нужно вручную вызывать delete для выделенной памяти или дескрипторов Qt?

Пример

QListView *newlist = new QListView(); //This is good? if so why?
QListView newlist; // why not this?

Ответы [ 3 ]

3 голосов
/ 17 августа 2010
QListView* newlist = new QListView(); //This is good? if so why?

Только если вы храните указатель newlist где-нибудь и позже удаляете его вручную.

Если возможно, я бы предложил разместить ваши виджеты в стеке.Однако это невозможно при использовании техники, которую я собираюсь объяснить.

При разработке сложных виджетов вы обычно создаете дерево объектов виджетов.Это означает, что у каждого виджета, кроме корневого, есть родитель.Когда родитель удаляется, он автоматически удаляет всех своих потомков.Этот метод очень удобен, потому что вам нужно будет только отслеживать корневой виджет.

В вашем случае вы бы сделали что-то вроде этого:

QListView* newlist = new QListView(parentWidget);
3 голосов
/ 17 августа 2010

Смотрите мой мой ответ о QObjects.Короче говоря: каждый создает виджеты в куче, поскольку они обычно должны переживать текущий метод, и они не могут быть ни назначены, ни скопированы.QWidget удаляет своих потомков, когда они сами удаляются (или, в более общем случае, QObjects удаляют своих потомков), поэтому обычно нет проблем с управлением памятью, если вы передаете родительский элемент виджету.

3 голосов
/ 17 августа 2010

Похоже, что безопасно делать распределение стека. См. этот ответ . В случае с Symbian это может отличаться. Этот вопрос поднимает некоторые хорошие вопросы.

Я думаю, что в Symbian у вас ограниченное пространство стека, и многие из самих объектов используют общий доступ к данным, который все равно выделяется в куче. В связи с этим было бы неплохо продолжать делать это динамически.

...