MSVC6.0 и обработка исключений new
От: Alexander_1983 Россия  
Дата: 18.07.02 12:03
Оценка:
Следующая проблема:
у меня приложение написанное с использованием MFC. Выделяю память в конструкторе m_piBuf = new int[iSize], нужно обрабатывать ошибки выделения памяти. Согласно стандарту в случае ошибки при выделении new вернет NULL и бросит исключение std::bad_alloc, согласно документации по MFC будет брошено исключение CMemoryExeption — у меня же в этом месте возбуждается какое-то другое исключение(не CExeption и не std::exeption, отлавливается только на catch(...)). Хотелось бы знать что же все таки происходит. Может нужно включить какие-то опции компилятора(поддержка исключений у меня ВКЛЮЧЕНА). Более того, поиск в MSDN'е поддалкивает меня к мысли, что MSVC6.0 не поддерживает std::bad_alloc, и спецификацию исключений. Помогите разобраться.
Re: MSVC6.0 и обработка исключений new
От: dupamid Россия  
Дата: 18.07.02 12:10
Оценка:
Здравствуйте Alexander_1983, Вы писали:

A1>Следующая проблема:

A1>у меня приложение написанное с использованием MFC. Выделяю память в конструкторе m_piBuf = new int[iSize], нужно обрабатывать ошибки выделения памяти. Согласно стандарту в случае ошибки при выделении new вернет NULL и бросит исключение std::bad_alloc, согласно документации по MFC будет брошено исключение CMemoryExeption — у меня же в этом месте возбуждается какое-то другое исключение(не CExeption и не std::exeption, отлавливается только на catch(...)). Хотелось бы знать что же все таки происходит. Может нужно включить какие-то опции компилятора(поддержка исключений у меня ВКЛЮЧЕНА). Более того, поиск в MSDN'е поддалкивает меня к мысли, что MSVC6.0 не поддерживает std::bad_alloc, и спецификацию исключений. Помогите разобраться.

А как ты ловишь исключения? Попробуй ловить их по ссылке или указателю, так как выбрасываетсмя ни CExeption, а производный от него класс. Скорее всего выбрасывается все-таки CMemoryExeption, но по указателю. А лучше, сходит под отладчиком и все узнаешь сам. Для этого можно заставить отладчик останавливаться при выбросе исключения.
Re[2]: MSVC6.0 и обработка исключений new
От: al Россия  
Дата: 23.07.02 10:18
Оценка:
Да-да-да, есть такая особенность MFC — все исключения передаются как указатели. И для их довли надо писать на catch, а CATCH (т.е. использовать макрос MFC). Подробности есть в MSDN.


Re: MSVC6.0 и обработка исключений new
От: Stanislav V. Zudin Россия  
Дата: 23.07.02 14:30
Оценка:
Здравствуйте Alexander_1983, Вы писали:

A1>у меня приложение написанное с использованием MFC. Выделяю память в конструкторе m_piBuf = new int[iSize], нужно обрабатывать ошибки выделения памяти.


Предположу, что исключение у тебя вообще не бросается, а new int[blablabla] возвращает NULL, по которому ты, не проверив, пытаешься обратиться.
У Мелкомягких по умолчанию new, в случае ошибки, возвращает NULL. Чтобы заставить его бросать исключение копай в сторону set_new_handler.

А CMemoryExeption — это вообще из другой оперы.
Успехов!
_____________________
С уважением,
Stanislav V. Zudin
Re: MSVC6.0 и обработка исключений new
От: Alexander_1983 Россия  
Дата: 24.07.02 06:10
Оценка:
Спасибо всем, кто отвечал на мой вопрос. Действительно проблема была в том, что MSVC6.0 бросает исключение о нехватке памяти по указателю(стандарт же они похоже не поддерживают — std::bad_alloc не летит). По всей видимости, объект CMemoryException создается при начальной инициализации программы, так что когда возникают проблемы с выделением памяти они могут гарантировать, что исключение CMemoryException будет брошено — отсюда и решение бросать его по указателю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.