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

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

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

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

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

..За все?

Спасибо и простите меня, я сам признаю Symbian n00b.


person adam    schedule 03.12.2008    source источник


Ответы (3)


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

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

person ayaz    schedule 03.12.2008

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

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

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

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

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

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

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

person Dynite    schedule 03.12.2008

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

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

person michael aubert    schedule 03.12.2008