Практики и инструменты управления памятью для Symbian C ++

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

Вопрос

Я почти закончил свое первое работающее приложение для Symbian, но в моем ускоренном обучении мало внимания уделял управлению памятью, обработке и очистке стека?

Может, кто-нибудь подскажет мне некоторые из лучших практик, которые можно использовать здесь, и, возможно, некоторые из лучших инструментов обнаружения утечек / профилирования памяти.

Например, если я возьму TDesC или TPtrC16 внутри функции, как мне затем очистить их наилучшим образом, просто

TPtrC16 temp = ...
temp.CleanupClosePushL();
CleanupStack::PopAndDestroy()

.. для всего?

Спасибо и, пожалуйста, прости меня, я сам признался в Symbian n00b.

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

Решение

В прошлом я использовал HookLogger из Symbian для отслеживания и исследовать утечки памяти. Это не самое лучшее, но это действительно помогает. Кроме того, маркеры кучи вызывают панику ALLOC в случае утечек памяти при каждом выходе из приложения. Информация, которую предоставляют эти паники, едва полезна, но это хороший признак того, что где-то есть утечка памяти. Оттуда вы можете использовать такие инструменты, как HookLogger, чтобы определить, в какой части кода возникает утечка.

Я упомянул несколько ресурсов Symbian в ответ на эту тему , Хотя все это было для меня наиболее полезным, я нашел книгу Аккредитованный учебник для начинающих Symbian Developer очень полезен. Если бы вы могли получить в свои руки, я определенно рекомендую это. Это краткое чтение, но оно блестяще объясняет концепции, в том числе об управлении памятью и дескрипторах.

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

Вещи, хранящиеся в стеке, не нужно хранить в стеке очистки (если они не требуют специальной обработки (R-классы и т. д., см. ниже))

Стек очистки предназначен для удаления объектов, когда происходит отпуск (думаю, исключение), который в противном случае может привести к утечке памяти.

Фактическое использование стека очистки происходит через статические функции CleanupStack :: PushL (..) и CleanupStack :: Pop / PopAndDestroy.

Некоторые классы, такие как RFile, RF должны быть закрыты, а не удалены, поэтому для этих функций вызывается их функция :: Close, поэтому вам следует использовать глобальную функцию CleanupClosePushL (), которая вместо вызова оператора delete для вашего объекта на В противном случае он вызывает функцию класса ':: Close.

Чтобы проверить ваш код на утечки памяти, вы можете использовать макросы __UHEAP_MARK; и __UHEAP_MARKEND; который проверит, что между этими двумя вызовами ничего не осталось в куче.

Если вы оставите что-либо на стеке очистки в CActive's :: RunL, активный планировщик будет в панике.

В качестве общей методики, если функция, которую вы вызываете , может выйти (обозначается завершающим символом 'L'), тогда любой тег, который должен быть удален или закрыт (и т. д.), должен быть добавлен в стек очистки.

Требуется чуть менее 10 страниц, чтобы правильно объяснить все, что вам нужно знать об CleanupStack и управлении памятью для Symbian C ++.

Бесстыдный плагин: эта книга была написана специально для вашего уровня n00bness: http://www.quickrecipesonsymbianos.com

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