Следующая проблема:
у меня приложение написанное с использованием MFC. Выделяю память в конструкторе m_piBuf = new int[iSize], нужно обрабатывать ошибки выделения памяти. Согласно стандарту в случае ошибки при выделении new вернет NULL и бросит исключение std::bad_alloc, согласно документации по MFC будет брошено исключение CMemoryExeption — у меня же в этом месте возбуждается какое-то другое исключение(не CExeption и не std::exeption, отлавливается только на catch(...)). Хотелось бы знать что же все таки происходит. Может нужно включить какие-то опции компилятора(поддержка исключений у меня ВКЛЮЧЕНА). Более того, поиск в MSDN'е поддалкивает меня к мысли, что MSVC6.0 не поддерживает std::bad_alloc, и спецификацию исключений. Помогите разобраться.
Здравствуйте 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, но по указателю. А лучше, сходит под отладчиком и все узнаешь сам. Для этого можно заставить отладчик останавливаться при выбросе исключения.
Да-да-да, есть такая особенность MFC — все исключения передаются как указатели. И для их довли надо писать на catch, а CATCH (т.е. использовать макрос MFC). Подробности есть в MSDN.
Здравствуйте Alexander_1983, Вы писали:
A1>у меня приложение написанное с использованием MFC. Выделяю память в конструкторе m_piBuf = new int[iSize], нужно обрабатывать ошибки выделения памяти.
Предположу, что исключение у тебя вообще не бросается, а new int[blablabla] возвращает NULL, по которому ты, не проверив, пытаешься обратиться.
У Мелкомягких по умолчанию new, в случае ошибки, возвращает NULL. Чтобы заставить его бросать исключение копай в сторону set_new_handler.
А CMemoryExeption — это вообще из другой оперы.
Успехов!
_____________________
С уважением,
Stanislav V. Zudin
Спасибо всем, кто отвечал на мой вопрос. Действительно проблема была в том, что MSVC6.0 бросает исключение о нехватке памяти по указателю(стандарт же они похоже не поддерживают — std::bad_alloc не летит). По всей видимости, объект CMemoryException создается при начальной инициализации программы, так что когда возникают проблемы с выделением памяти они могут гарантировать, что исключение CMemoryException будет брошено — отсюда и решение бросать его по указателю.