Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 07:31, 14 July 2007.

Стек очистки (Cleanup stack)

From Forum Nokia Wiki

Перевод с английского, оригинальная статья находится здесь


При выполнении приложения не должно быть никаких утечек памяти - это очень важно, поэтому Вы должны предпринимать определенные действия, чтобы быть уверенными в том, что все выделенные в динамической памяти объекты будут удалены при выбрасывании исключения. Стек очистки предоставляет весь необходимый функционал для реализации этого подхода.

Класс CleanupStack, как и любой стек, определяет два основных метода PushL и Pop. Основная цель стека очистки сохранить указатели на выделенные в куче объекты и уничтожить эти объекты в случае возникновения исключительной ситуации.

Никогда не помещайте в стек очистки данные-члены класса. Если указатель на динамически созданный объект был сохранен в существующем объекте класса - он должен быть удален из стека очистки, так как за уничтожения этого объекта теперь отвечает деструктор объекта-владельца.

Для гарантированного уничтожения динамически созданных объектов всегда помещайте их в стек очистки.

Contents

Рассмотрим пример

CDemo* demo = new CDemo;
DangerousOperationL();
delete demo;

Если во время выполнения функции DangerousOperationL() произойдет сброс, объект demo НЕ БУДЕТ уничтожен, занятая им динамическая память НЕ БУДЕТ освобождена.

Решение проблемы - использование стека очистки

CDemo* demo = new CDemo();
CleanupStack:: PushL(demo);
DangerousOperationL();
CleanupStack:: PopAndDestroy();

В данном примере уничтожение объекта demo производится с помощью стека очистки. Если выполнение DangerousOperationL() прошло нормально, производится извлечение объекта из стека и его уничтожение одним вызовом CleanupStack:: PopAndDestroy(). Если же во время выполнения DangerousOperationL() произошел сброс, уничтожение объекта demo будет выполнено стеком очистки автоматически в контексте возникшего сброса. Соответственно, использование стека очистки является обязательным условием при создании программ под Symbian ОС.


Может ли во время выполнения CleanupStack::PushL() произойти сброс ?

Теоретически, да. Однако это не должно Вас беспокоить - данный вариант развития событий предусмотрен, поэтому в стеке очистки всегда есть хотя бы одна свободная позиция. Когда Вы помещаете ваш объект в стек очистки, он занимает имеющуюся свободную позицию, далее выполняется попытка выделить память для новой свободной позиции. Если памяти недостаточно - происходит сброс - Ваш объект, уже помещенный в стек, извлекается и уничтожается. На самом деле, стек очистки выделяет память сразу под несколько позиций и может не сразу освобождать память, выделенную для хранения указателей при вызове метода Pop(). Поэтому операции помещения/извлечения объектов из стека очистки являются очень эффективными.

Ссылки по теме

Related Discussions
Thread Thread Starter Forum Replies Last Post
Error while useing HBufC !!!!! ankushbabrekar General Symbian C++ 9 2007-04-21 13:24
What means postfix 'D'? methe General Symbian C++ 3 2007-10-01 06:35
Problem with Thread and Active Object paipeng General Symbian C++ 1 2007-03-13 19:47
Convert TPtrC to e.g. TBuf8 kaiten-sushi General Symbian C++ 33 2007-02-27 23:09
奇怪的问题,app里不出现异常,exe文件里就会:( test_008 Symbian 11 2008-09-17 09:08
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX