Как справиться с утечками памяти? - PullRequest
1 голос
/ 22 августа 2011

Я не очень знаком с обработкой памяти, но в настоящее время я работаю над проектом Qt (c ++), разрабатываю приложение для устройств Symbian, используя Qt Nokia SDK.

Платформа: Windows 7

1-й вопрос: Если я создаю кнопку, как это:

* * 1010

QPushButton * button = new QPushButton (parent);

Должен ли я удалить его? (Думаю, нет, поскольку это часть пользовательского интерфейса, но поправьте меня, если я не прав).

2-й вопрос: Как я могу найти утечку памяти, знаете ли вы какие-нибудь хорошие программы, которые могут помочь мне с этим?

Я пытался использовать инструмент Nokia Analyzer, но когда я запускаю atool:

atool.exe -lf build armv5 udeb -f phoneMeomoryLog

я просто получаю

Тип сборки: udeb Платформа сборки: armv5 Режим сбора данных: войти в Размер стека вызовов: 40 Свободный размер стека вызовов: 0 Отложено бесплатно: функция отключена Проверка повреждения кучи (блокировка защиты): функция отключен AnalyzeTool: ошибка при создании / чтении make-файлов.

Надеюсь, кто-нибудь ответит мне.

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 22 августа 2011

1-й вопрос: Нет, вам не нужно его удалять.Он будет удален при удалении родительского элемента .Таким образом, вы должны удалить родителя, который, вероятно, является формой или диалогом.

Когда вы создаете диалог с Qt :: WA_DeleteOnClose , флаг Qt удаляет этот виджет, когда виджет принял событие закрытия.Так что у вас не будет никаких утечек памяти.

Так что создайте свой диалог с этим флагом и добавьте свои виджеты, как вы делаете сейчас, и у вас все будет хорошо.

2-й вопрос: Если выработающие в Linux, используйте valgrind.

пример: valgrind --tool = memcheck --leak-check = yes ./myprogramname

valgrind имеет много опций, которые вы можете использоватьдля тонкой настройки.

Также использование * unique_ptr * или * auto_ptr *, если вы используете более старый c ++ или QScopedPointer - хорошие методы программирования, позволяющие избежать утечек памяти.

1 голос
/ 22 августа 2011
  1. Ответ на ваш первый вопрос - Нет. Кажется, что в отличие от стандартных объектов GUI для Windows, в Qt его не следует удалять.Он освобождается, когда закрывается ваше главное окно.

  2. Вы можете использовать детектор связей памяти Microsoft, встроенный в VS.Найти больше в этой ссылке .

0 голосов
/ 28 августа 2011

Оба "Это освобождается, когда закрывается ваше главное окно." и "Родитель просто освобождает ресурсы пользовательского интерфейса, а не память !!! - хсалими" неверны. Родитель хранит список своих потомков и удаляет их, когда он сам уничтожается. Это не имеет ничего общего с «ресурсами пользовательского интерфейса» или «главным окном», это нормальное поведение QObject. std :: auto_ptr здесь также не нужен и не полезен.

0 голосов
/ 22 августа 2011

Ну, у меня нет опыта работы с Qt Nokia SDK, но я основываюсь на своих знаниях C ++.

  1. Да.Все созданное новым должно быть позже освобождено.Указатель не может освободиться, и C ++ не предлагает никакого сборщика мусора.

  2. Есть несколько способов.Например, проверьте, сколько новых вы делаете и сколько удалите .Для каждого нового должно быть где-то delete .Проверьте используемую память: если используемая память только увеличивается и никогда (или не часто) уменьшается, значит, вы неправильно обрабатываете память.Убедитесь, что вы удаляете все выделенные ресурсы для деструкторов.

Чтобы избежать этого, вы можете использовать авто-указатели

...