Discussion Board

Results 1 to 7 of 7
  1. #1
    Registered User dudko_av's Avatar
    Join Date
    Jul 2010
    Posts
    5
    пожалуйста посмотрите правильно но ли создан двухфазный конструктор и правильно ли используется функция CleanupStack в функции TestL()

    Code:
    class CTest : public CBase
    	{
    	TInt* iI;
    public:
    	static CTest* NewL()
    			{
    			CTest* self = CTest::NewLC();
    			CleanupStack::Pop(self);
    			return self;
    			}
    	static CTest* NewLC()
    			{
    			CTest* self = new (ELeave) CTest;
    			CleanupStack::PushL(self);
    			self->ConstructL();
    			return self;
    			}
    	void ConstructL()
    		{
    		iI = new (ELeave) TInt;
    		}
    	virtual ~CTest()
    		{
    		delete iI;
    		}
    	};
    
    
    void TestL()
    	{
    	CTest* A = CTest::NewL();
    	CleanupStack::PushL(A);
    	console->Getch();
    	CleanupStack::PopAndDestroy(A);
    	}
    //  Local Functions
    
    LOCAL_C void MainL()
    	{
    	//
    	// add your program code here, example code below
    	//
    	TestL();
    	}

  2. #2
    Nokia Developer Champion Den123's Avatar
    Join Date
    Jul 2007
    Location
    Magnitogorsk, Russia
    Posts
    536
    Конструктор на первый взгляд правильный. Не очень понятно, зачем хранить TInt в динамической памяти ?

    В TestL для чего помещаете объект в стек очистки ? Вызов console->Getch() к сбросу приводить не должен.

  3. #3
    Registered User dudko_av's Avatar
    Join Date
    Jul 2010
    Posts
    5
    Quote Originally Posted by Den123 View Post
    Не очень понятно, зачем хранить TInt в динамической памяти ?
    для примера использования динамической памяти(правильного выделения памяти и потом удаления),
    Quote Originally Posted by Den123 View Post
    В TestL для чего помещаете объект в стек очистки ?
    что бы после использования объекта потом его удалить.или я что то не правильно понял?..

  4. #4
    Registered User SiNoptik's Avatar
    Join Date
    Dec 2005
    Posts
    93
    Удалить его можно просто вызвав delete.
    Стэк очистки используется для того, что бы при возникновении сброса в функции, произошло автоматическое удаление всех ранее созданых объектов (для этого их помещают в стэк очистки) и не случилось утечки памяти. Если сброса не произошло, тогда указатели на объекты достаются из стэка (или сразу же удаляются).
    У вас на промежутке между CleanupStack::PushL и CleanupStack::PopAndDestroy даже потенциально не может возникнуть сброс, поэтому можно смело убирать использование CleanupStack. Ничего страшного не произойдет в вашем коде, но идеологически это не правильный код. Всё-таки нужно понимать смысл того, что написано...

  5. #5
    Registered User dudko_av's Avatar
    Join Date
    Jul 2010
    Posts
    5
    изучаю по английскому учебнику и уже второй день пытаюсь правильно перевести и понять главу про стек очистки, кто нибуть может "по- русски " объяснить когда следует использовать стек очистки? заранее благодарен.

  6. #6
    Regular Contributor privatejoker's Avatar
    Join Date
    Jun 2008
    Posts
    51
    Quote Originally Posted by dudko_av View Post
    изучаю по английскому учебнику и уже второй день пытаюсь правильно перевести и понять главу про стек очистки, кто нибуть может "по- русски " объяснить когда следует использовать стек очистки? заранее благодарен.
    Наши заморские друзья сделали модный редезигн FN и почему-то жертвой стала ссылка в меню навигации на единственный^W один из самых полезных разделов FN-Wiki.
    Но поиск по нему работает:

    http://www.forum.nokia.com/basic-sea...82%D0%BA%D0%B8

  7. #7
    Registered User Ktulhu's Avatar
    Join Date
    Sep 2009
    Posts
    33
    Quote Originally Posted by dudko_av View Post
    изучаю по английскому учебнику и уже второй день пытаюсь правильно перевести и понять главу про стек очистки, кто нибуть может "по- русски " объяснить когда следует использовать стек очистки? заранее благодарен.
    Это фишка симбовской системы исключений. Когда вызывается User::Leave (бросается исключение) содержимое стека функции теряется. Для решения этой проблемы изобрели CleanupStack (видимо классические исключения c++ были слишком тормозными для ранних девайсов). Чтобы не было утечки памяти, всё что должно быть удалено складывается в «Стек очистки» при помощи CleanupStack::PushL для C классов или CleanupClosePushL для R классов. Содержимое этого стека корректно уничтожается вплоть до следующего уровня ловушки TRAP. Отсюда — стек очистки следует использовать перед всеми функциями, которые бросают исключения. Они обозначаются L на конце. Оператор new (ELeave) может бросить исключение KErrNoMemory

Similar Threads

  1. Как изменить код блокировки
    By vadimkozin in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 4
    Last Post: 2010-05-06, 13:23
  2. Работает на эмуле не работает на устройстве
    By Sof_Evgen in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 2
    Last Post: 2010-02-12, 14:53
  3. Тест своего приложения на входной звонок и на входящее СМС.
    By Maxfox111 in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 8
    Last Post: 2010-02-09, 19:39
  4. Помогите снять код блокировки Делимся опытом!!!!
    By Britva163 in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 1
    Last Post: 2009-01-07, 17:20

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Nokia Developer aims to help you create apps and publish them so you can connect with users around the world.

京ICP备05048969号  © Copyright Nokia 2013 All rights reserved