![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
InvalidProperty |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
уже часа 2 ломаю голову над проблемой.
Есть код:
в котором MyException не ловится, а ловится ... . причем если выбросить MyException, скажем, в блоке try на первом уровне, то поймается замечательно. В чем может быть проблема??? ![]() ЗЫ компилятор - MS VS C++ 6.0 Добавлено через 13 минут и 14 секунд только что попробовал изменить код на
т.е. чтобы метод класса B не вызывался, а MyException выбрасывался в родительском классе. Так все прекрасно работает. Что за фигня может быть с наследованием и виртуальными методами??? -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
||||
|
|||||
InvalidProperty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
блин, хрень какая-то.
даже целое не ловится из дочернего класса :( -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
InvalidProperty, Учитывая, что компилятору лет столько же, сколько моему покойному деду, то это нормально!
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
InvalidProperty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
andrew_121, и все-таки... должен же быть выход
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Я не вижу ошибок. Попробуй скомпилить нормальным компилятором.
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
InvalidProperty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
andrew_121, блин, и я не вижу теперь ошибок. Главная ошибка - не спал ночью. Заключалась ошибка в том, что у меня класс B выглядит примерно следующим образом:
теперь же я добавил пару проверок и все стало пучком. -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
И я не спал. Сейчас пойду. Решил обойтись без исключений? -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
InvalidProperty |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
andrew_121, не... с исключениями. Решил сначала проверять на NULL перед тем, как что-то очищать, а после очистки еще и NULL присваивать, чтобы потом все было хорошо.
-------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
|||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
NULL присваивать не надо. delete должен это делаеть сам. Если используется старый компилятор, то лучше сменить. Под линух g++ (я пользуюсь Code::Blocks) под винду всё же лучше MS VS Express чем GNU компилятор. (но для учебных целей g++ лучше, потому что он более строго придерживается стандарта С++) Считаю очень плохой практикой выделять в одной и той же программе память при помощи и malloc и new. Может привести к ошибкам, особенно если захочешь заменить char* на std::string. Между ними есть огромная разница. И вообще, malloc надо использовать только в C ! Если программируешь с исключениями (или хотя бы пользуешься new без (nothrow)) то советую почитать про безопастность исключений. В первую очередь у Страуструпа. Таже, просто необходимо понимать что представляет из себя "раскрутка стека" (имеется ввиду стек программы) которая происходит при порождении исключения и прекращается при отлове блоком catch (этот же catch, может, по желаню продолжить, раскрутку при помощи пустого throw; ) -------------------- вопросов больше чем ответов |
|||
|
||||
InvalidProperty |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 356 Регистрация: 31.10.2007 Где: Россия, Казань Репутация: нет Всего: 9 |
Леопольд, дорогой товарищ!
Спасибо за ответ, я очень признателен. Дело лишь в том, что тот код, который я выложил - всего лишь болванка того, что был у меня на самом деле. Я хотел лишь передать людям смысл того, что я делаю, чтобы было понятно, как поступать дальше. Все, что ты написал, это истина, за исключением того, что я не уверен в том, что delete присваивает NULL к удаляемому параметру. Я более склонен доверять официальным источникам, где про сие чудо не сказано ни слова, да и ко всему прочему, опытным путем доказывается обратное к тому, что ты сказал по поводу delete. Дорогой мой Леопольд, под линух я, как и ты, использую gcc, который включает в себя и С++ и много чего еще, ибо расшифровывается как GNU Compiler Collection. Code::Blocks я не использую.
я так не считаю, если память выделяется для разных объектов (читай: сущностей).
сущая правда, друг мой убей того, кто тебе это сказал! может быть вообще функции C не использовать, такие, как memset, printf, strcpy...
Это ты про чего? может я упустил кое-что в своей жизни? это точно!!! без этого нельзя пользоваться исключениями. вот только на счет скобок я хочу оговориться, что если верхнего catch не будет, то программа вылетит с ошибкой "Unhandled exception" Еще раз благодарствую за подробный ответ ![]() Это сообщение отредактировал(а) InvalidProperty - 18.6.2009, 12:47 -------------------- dd if=$0 of=$0 bs=1 count=76 seek=`du -b $0 | awk {'print $1'}` 2>/dev/null dd if=$0 of=$0 bs=1 count=67 conv=notrunc oflag=append 2>/dev/null echo $0 >> $0 |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
не должен и не делает. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А я бы вам посоветовал прочитать что нибудь посерьезнее. Стауструп всего лишь основы. Это сообщение отредактировал(а) azesmcar - 18.6.2009, 14:03 |
|||
|
||||
Леопольд |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Осмелюсь заметить что я комментирова код, который оказался "болванкой" Я всё равно не буду пользоваться malloc в C++, new (nothrow) (который и присваивает 0 в случае неудачи) вполне его заменяет. Хотя, я не говорю о системах для которых критична одна инструкция. Но тамС++ как правило не нужен. Грешен, каюсь, перепутал результат действия delete c неудачным вызовом new (nothrow)... Как правило, есть замена функциям С. Библиотека С++ гораздо богаче. Вижу смысл использовать стандартные функции С только если нет замены в С++ или в open source библиотеках. Уж для printf и strcpy точно есть. ![]() Код выглядел так как буд-то ты начал изучать С++ около года назад. Под одёжке встречают... Про "безопасность исключений" есть раздел у Страуструпа "Язык С++. Специальное издание". Смысл в том, что стоит использовать shared_ptr и т.д. и т.п. В общем, можно писать код так, что в catch блоках будет происходить минимальная обработка, почти полностью относящаяся к исключению а не очиска памяти или состояний или... Добавлено через 8 минут и 10 секунд А поконкретнее? Что-то типа "Освои С++ за 21 день" и "С++ для чайников"? У Страуструпа около 1000 страниц мелким шрифтом причём на шаблоны у него похоже просто не хватило места. По моему серьёзнее только стандарт языка. Но мне лень его читать. Сейчас читаю "Шаблоны. Справочник разработчика", потом планирую Александреску "Современное проектирование на С++" Что ещё мне надо по Вашему мнению прочитать/понять? -------------------- вопросов больше чем ответов |
||||||
|
|||||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Именно при неудаче! То же само делает malloc(). Но не free(), operator delete не присваивают NULL, указателю который освободили. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
Мэтью Уилсона "Imperfect C++" ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |