Russian Qt Forum
Май 16, 2024, 00:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Почему не срабатывает блок try?  (Прочитано 23366 раз)
a_n_y_a
Гость
« : Август 19, 2009, 08:36 »

Есть такой код:

#include "iostream"

class A
{
public:
   int b;
   void Pokaz(){printf("Pokaz\n");};
};


int main()
{
   try
   {
      A *a=0;
      a->b=5;
      a->Pokaz();
   }
   catch(...)
   {
      printf("try\n");
   };
};

При выполнении выдает следующее:
[root@localhost ~]# /usr/NULL/Null/Debug/Null
Ошибка сегментирования
[root@localhost ~]#

Почему не срабатывает try?

Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 19, 2009, 09:10 »

С какими параметрами собрана Qt?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #2 : Август 19, 2009, 09:27 »

А причем здесь Qt?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
a_n_y_a
Гость
« Ответ #3 : Август 19, 2009, 09:30 »

Qt здесь не использовалась, но код с использование Qt в такой же ситуации тоже не работает правильно. В этом примере ошибка выделена в простом коде.
Записан
BRE
Гость
« Ответ #4 : Август 19, 2009, 09:43 »

А кто сказал, что плюсовый try должен отрабатывать такие исключения?  Подмигивающий
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #5 : Август 19, 2009, 09:45 »

а я чего-то не понимаю, или исключение некому бросать? сегфолт - это системное событие а не результат системного вызова (как при new). Я бы сказал, что это не исключение...
Записан
Winstrol
Гость
« Ответ #6 : Август 19, 2009, 10:09 »

Почему не срабатывает try?
Под windows разыменование нулевого указателя это так называемое SEH-исключение, а не с++-исключение. Для того, чтобы его ловить в блоке catch, нужно установить функцию транслирующую SEH в с++-исключения с помощью вызова системной  _set_se_translator. Примнры кода можно найти поиском по _set_se_translator.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #7 : Август 19, 2009, 11:29 »

А причем здесь Qt?
Улыбающийся Что-то вспомнилось про ключик -exeption. Ошибся малость.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
a_n_y_a
Гость
« Ответ #8 : Август 20, 2009, 09:53 »

Посмотрел я в интернете, прошелся поиском по своему линуксу, и что то ничего нет. В интернете есть примеры только для виндов. Что же, под линуксом ничего сделать невозможно?
Записан
denka
Гость
« Ответ #9 : Август 20, 2009, 10:11 »

Возможно - перед обращением к указателю проверять валидный ли он
Записан
BRE
Гость
« Ответ #10 : Август 20, 2009, 10:13 »

Посмотрел я в интернете, прошелся поиском по своему линуксу, и что то ничего нет. В интернете есть примеры только для виндов. Что же, под линуксом ничего сделать невозможно?
Почитай про системные сигналы в linux. Для начала man signal.

Записан
a_n_y_a
Гость
« Ответ #11 : Август 20, 2009, 10:20 »

Возможно - перед обращением к указателю проверять валидный ли он

Вот это то мне и надо, но как это сделать без возникновения исключения? Если возможно, приведи код. Буду очень благодарен.
Записан
ритт
Гость
« Ответ #12 : Август 20, 2009, 10:44 »

Код:
if (ptr) ptr->doSomething();
Улыбающийся
Записан
a_n_y_a
Гость
« Ответ #13 : Август 20, 2009, 12:45 »

Код:
if (ptr) ptr->doSomething();
Улыбающийся
Делаю:

if (ptr) printf("валидный указатель");
else printf("Не валидный указатель");
delete ptr;
printf(Удалили);

При ptr=NULL получаю:
Не валидный указатель
Удалили

При ptr указывающий на самоудалившийся процесс, получаю:
валидный указатель 

И все, сообщение "Удалили" я не получаю, программа вылетает на delete ptr.
Как мне проверить, объект удален из памяти или нет? В программе с Qt ptr указывает на процесс.
Записан
Rcus
Гость
« Ответ #14 : Август 20, 2009, 12:53 »

Классический случай dangling pointer.
Что значит указывает на процесс, всмысле на объект класса QProcess? Тогда QPointer же.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.055 секунд. Запросов: 23.