Практики и инструменты управления памятью для Symbian C ++
-
22-07-2019 - |
Вопрос
Я почти закончил свое первое работающее приложение для 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