Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.159.224] |
|
Сообщ.
#1
,
|
|
|
В консольном проекте std::bad_alloc ловится, а в диалоговом приложении MFC, нет. Изучал разные варианты.
Код консольного приложения: #include "stdafx.h" #include "MyInt.hpp" #include <string> #include <iostream> #include <new> using namespace std; int main() { std::locale Loc = std::locale::global(std::locale("russian")); char *buf = NULL, *buf1 = NULL; try { buf = new char[_I64_MAX_MY - 5]; buf1 = new char[_I64_MAX_MY - 5]; } catch (std::bad_alloc) { wcout<< _T("Сработал std::bad_alloc ошибка выделения памяти для массива\n"); } catch (...) { wcout << _T("std::bad_alloc не сработал\n"); }; int i; wcout << _T("Введите любое число i="); wcin >> i; if (buf != NULL) delete[]buf; if (buf1 != NULL) delete[]buf1; return 0; }; Константа _I64_MAX_MY и MAX_MY_INT принимает значение положительного диапазона целого, в зависимости от типа сборки, x86 или x64. Файл в прилагаемом проекте. Код в диалоге: void CMyThrowCatchDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here char *buf = NULL, *buf1 = NULL; try { buf = new char[MAX_MY_INT - 5]; buf1 = new char[MAX_MY_INT - 5]; } catch (CMemoryException& mex) { CString s; s = _T("Сработал CMemoryException ошибка выделения памяти для массива "); AfxMessageBox(s); } catch (std::bad_alloc& ba) { CString s; s = _T("Сработал std::bad_alloc ошибка выделения памяти для массива "); AfxMessageBox(s); } catch (...) { CString s; s = _T("std::bad_alloc, CMemoryException не сработал"); AfxMessageBox(s); }; if (buf != NULL) delete[]buf; if (buf1 != NULL) delete[]buf1; }; Где грабли? Файл MyThrowCatchNew.rar - Проект диалога MFC, ThrowNew.rar - консольный проект. Прикреплённый файлMyThrowCatchNew.rar (128,6 Кбайт, скачиваний: 306) Прикреплённый файлThrowNew.rar (4,64 Кбайт, скачиваний: 302) |
Сообщ.
#2
,
|
|
|
MFC исключения бросаются по указателю. Обратите внимание как написаны макросы TRY CATCH
catch (CMemoryException* mex) { AfxMessageBox(_T("Сработал CMemoryException ошибка выделения памяти для массива ")); mex->Delete(); } |