Практики и инструменты управления памятью для Symbian C ++ - PullRequest
2 голосов
/ 03 декабря 2008

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

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

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

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

.. за все?

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

Ответы [ 3 ]

3 голосов
/ 03 декабря 2008

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

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

2 голосов
/ 03 декабря 2008

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

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

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

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

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

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

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

1 голос
/ 03 декабря 2008

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

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

...