Discussion Board

Results 1 to 10 of 10
  1. #1
    Registered User Tymoschyk's Avatar
    Join Date
    Feb 2011
    Posts
    10
    Здравствуйте.
    Наблюдаю следующую проблему: я написал свой обработчик для события активации формы SettingItem List "HandleTestSettingsSettingItemListViewActivatedL" - в этой процедуре содержится код где помимо прочего создается дескриптор из кучи:

    Code:
    HBufC8* FileData(NULL);
    Компиляция происходит нормально, но при запуске приложения оно вылетает на переходе на новую форму. Я провел несколько експериментов и выяснил следующее:
    - Если этот же код прописать в обработчке меню - он отрабатывает нормально и проблема не возникает
    - В режиме Debug вся процедура отрабатывает нормально, ошибка появляется вне моего кода
    - Емпирическим путем (комментируя куски кода в процедуре) я определлил что без строки
    Code:
    HBufC8* FileData(NULL);
    программа не вылетает.

    Подскажите пожалуйста как решить эту проблему?

  2. #2
    Nokia Developer Moderator truf's Avatar
    Join Date
    Jun 2007
    Location
    Moscow, Russia
    Posts
    1,355
    Это
    Code:
    HBufC8* FileData(NULL);
    не дескриптор в куче, а лишь указатель на него. К тому же пустой. Т.е. дескриптор вами еще не создан. При любом обращении к объекту по этому указателю до того, как он начнет ссылкаться на настоящий дескрипотр, у вас будет возникать паника KERN-EXEC 3.
    Если вы не обращаетесь к объекту по этому указателю, то само его сущестовавние никак на работу программы не влияет.

  3. #3
    Registered User Tymoschyk's Avatar
    Join Date
    Feb 2011
    Posts
    10
    Да, конечно же за этим кодом следует собственно создание дескриптора и работа с ним

    Code:
    HBufC8* FileData(NULL); //Создаем пустой дескриптор для данных из файла
    CleanupStack::PushL(FileData);
    TInt FileLen(0); // Создаем переменную для хранения размера данных в файле
    TInt err = rFile.Size(FileLen); //Получаем размер файла
    if (KErrNone == err && FileLen> 0) //Если не произошло ошибки и размер больше нуля
    	{
    		FileData = HBufC8::NewL(FileLen);//Инициализация дескриптора с размером по размеру данных в файле
    		TPtr8 tempbuf (FileData->Des());
    		rFile.Read(0,tempbuf);	//Чтение всего файла			
    	}
    Извините, кажется я просто не совсем верно выразился. Программа вылетает именно при создании указателя, именно поэтому я привел этот фрагмент кода.

  4. #4
    Nokia Developer Moderator truf's Avatar
    Join Date
    Jun 2007
    Location
    Moscow, Russia
    Posts
    1,355
    Не нужно засовывать в стек пустой указатель. Указатель - это число. PushL() принимает аргумент TAny* - т.е. передается он по значению, а не по ссылке. Т.е. PushL() сделает копию с вашего указателя и будет работать с ним (поместит в стек). А пустой указатель - это 0. Если программа в самом PushL() и не вылетит, и вы инициализируете указатель значением - то оно в стеке не изменится, там останется 0. И при очистке стека вы уже точно получите KERN-EXEC 3.
    Т.е., тот объект, указатель на который вы поместили в стек через PushL, стеком запоминается и будет гарантировано им уничтожен. Независимо от того, что вы потом делаете с указателем на него (можете совсем избавиться от указателей на этот объект - он уже не потеряется). Что, в общем то, логично.

  5. #5
    Registered User Tymoschyk's Avatar
    Join Date
    Feb 2011
    Posts
    10
    И все же это не отвечает на главный вопрос, почему эта функция работает в методе обработчике Handle_MenuItem1SelectedL и не работает в обработчике активации формы.

  6. #6
    Nokia Developer Moderator truf's Avatar
    Join Date
    Jun 2007
    Location
    Moscow, Russia
    Posts
    1,355
    А где у вас открытие/закрытие rfile и где извлечение дескриптора из стека?
    И с каким кодом паники вылетает ваша программа?
    Last edited by truf; 2011-04-25 at 05:24.

  7. #7
    Registered User Tymoschyk's Avatar
    Join Date
    Feb 2011
    Posts
    10
    Работа с rFile есть, я просто не приводил весь код. Приблизительно процедура выглядит так:
    Code:
    RFs fsSession;
    RFile rFile;
    User::LeaveIfError(fsSession.Connect());	    							
    User::LeaveIfError(rFile.Open(fsSession,FileName, EFileWrite));		
    CleanupClosePushL(rFile);
    CleanupClosePushL(fsSession);
    ...............
    HBufC8* FileData(NULL);
    TInt FileLen(0);
    TInt err = rFile.Size(FileLen);
    if (KErrNone == err && FileLen> 0)
    	{
    	FileData = HBufC8::NewL(FileLen);
    	TPtr8 tempbuf (FileData->Des());
    	rFile.Read(0,tempbuf);			
    	}
    CleanupStack::PushL(FileData);
    ........................
    CleanupStack::PopandDestroy(5);
    .................
    Получить код паники я не могу, потому что в debug-режиме процедура выполняется нормально, а сброс происходит вне моей процедуры. Чтобы определить в чем проблема, я комментировал куски кода. В итоге программа не вылетала только когда была закомментирована строка
    Code:
    HBufC8* FileData(NULL);
    - и соответсвенно все что было после нее. Поэтому меня и интересует почему в процедурах активации формы я не могу использовать дескрипторы из кучи.

  8. #8
    Nokia Developer Moderator truf's Avatar
    Join Date
    Jun 2007
    Location
    Moscow, Russia
    Posts
    1,355
    Вы можете использовать дескрипторы кучи в процедурах активации формы.

    Поставьте errrd и сообщите мне код паники: http://dtarasov.ru/distribs/errrd.sisx

  9. #9
    Registered User Tymoschyk's Avatar
    Join Date
    Feb 2011
    Posts
    10
    Код паники: E32USER-CBase 71 - судя по описанию: http://wiki.forum.nokia.com/index.ph...2USER-CBase_71 эта паника возникает при неверном использовании ловушки, но только в моей процедуре никаких ловушек нет

  10. #10
    Registered User Ktulhu's Avatar
    Join Date
    Sep 2009
    Posts
    33
    Ловушки есть в фреймворке. Ваши функции вызываются фреймворком и, часто, имеют вид приведённый вами по ссылке. То есть фреймворк формирует ловушку и вызывает вашу функцию, например функцию обработки меню. Поскольку в коде есть ошибки, то программа падает. Сбалансируйте использование Push и Pop функций стека очистки и всё будет работать правильно.

Similar Threads

  1. Платежи из Ovi Store
    By lostdev in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 35
    Last Post: 2013-04-28, 09:10
  2. Есть ли команды из Казани?
    By feodus in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 0
    Last Post: 2009-10-15, 19:44
  3. Перехват загрузок из браузера.
    By bayanist in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 1
    Last Post: 2009-07-16, 09:41
  4. аналог std::map из С++
    By gpodno in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 3
    Last Post: 2009-05-27, 08:25
  5. Из TDes16 в TDes8
    By Dgut in forum Russian Developer Forum - Форум Российских разработчиков
    Replies: 7
    Last Post: 2008-08-29, 20:51

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