На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> catch (std::bad_alloc& ba) в MFC приложении не работает. , try{ ... new char[...]...} catch (std::bad_alloc) {} Не ловится исключение std::bad_alloc от NEW.
    В консольном проекте std::bad_alloc ловится, а в диалоговом приложении MFC, нет. Изучал разные варианты.
    Код консольного приложения:
    ExpandedWrap disabled
      #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. Файл в прилагаемом проекте.

    Код в диалоге:
    ExpandedWrap disabled
      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)
      MFC исключения бросаются по указателю. Обратите внимание как написаны макросы TRY CATCH

      ExpandedWrap disabled
        catch (CMemoryException* mex)
        {
           AfxMessageBox(_T("Сработал CMemoryException ошибка выделения памяти для массива "));
           mex->Delete();
        }
      Сообщение отредактировано: sharky72 -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0215 ]   [ 18 queries used ]   [ Generated: 25.04.24, 06:31 GMT ]