Re[3]: какое исключение ловить?
От: Павел Кузнецов  
Дата: 15.02.04 13:19
Оценка:
Здравствуйте, Вы писали:

> Седьмая студия?


7.1

> А Винда какая? Тоже интересно.


XP Professional Sp1
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: какое исключение ловить?
От: Tonal- Россия www.promsoft.ru
Дата: 15.02.04 20:27
Оценка:
ПК>Чуть-чуть модифицировал, чтобы быстрее память съедала:

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.00.9466 for 80x86
c:\>cl /EHsc /GR /Zc:wchar_t /Zc:forScope /nologo bad_alloc.cpp
bad_alloc.cpp
c:\>bad_alloc.exe
bad alloactor!


g++ (GCC) 3.2.3 (mingw special 20030504-1)
c:\>g++ -Wall -obad_alloc bad_alloc.cpp
c:\>bad_alloc.exe
bad alloactor!


Intel(R) C++ Compiler for 32-bit applications, Version 7.1 Build 20030307Z
c:\>icl /EHsc /GR /Zc:wchar_t /Zc:forScope /nologo bad_alloc.cpp
bad_alloc.cpp
c:\>bad_alloc.exe
bad alloactor!


Система — WinXP.
Хотя окошко с предупреждением о том, что виртуальная память заканчивается всёже появилось, но только 1 раз из 3-х запусков.
Можно попробовать подавить его средствами WinAPI — вроде есть фуцнкция, хотя нехватка памяти — это дело всей системы, а не только твоей проги, и месагу может вовсе какй системный процесс вываливать.
Я бы лучше попытался несколько ограничить аппетиты проги, или как-то следить за этим делом. ;-в
... << RSDN@Home 1.1.0 stable >>
Re[3]: какое исключение ловить?
От: Денис Ильин  
Дата: 16.02.04 08:58
Оценка:
В общем — рассказываю в чём было дело.
Наверняка кому нибудь понадобится.
Во первых, все эти bad_alloc-и нужно было вылавливать после
следующей операции:

#include <new.h>
#include <new>
using namespace std;

int _cdecl my_new_handler(size_t)
{
  throw bad_alloc();
  return 0;
}

  _PNH                _old_new_handler;
  _old_new_handler = _set_new_handler(my_new_handler);

..//тут вся ботва с try catch - в этом случае bad_alloc будет генерироваться
  try
  {

  }
  catch(bad_alloc &ba)//стандарт не гарантирует появления копии bad_alloc-а
  //поэтому ловить его нужно по ссылке
  {
    //сделать что нибудь
  }

  _set_new_handler(_old_new_handler);


Вот. Это во первых.
А во вторых — мессаго Out of memory вываливалась при использовании MFC(!)
При чем в любом случае.
Кстати, в этом случае такая перегрузка не поможет.
Вывод: используете MFC — ловите только MFC-шные исключения
Другие скорее всего не придут. (даже bad_alloc!)
(вечно у дяди Билли со стандартами напряженка).

Исправлено форматирование. Пожалуйста, пользуйтесь тегами [c] ... [/c], [code] ... [/code] и т.п. для выделения фрагментов кода. -- ПК.
Re: какое исключение ловить?
От: Аноним  
Дата: 16.02.04 10:22
Оценка:
Здравствуйте, Денис Ильин, Вы писали:

ДИ>Добрый день. Есть интересный вопросец.


ДИ>минипрограмка

ДИ>
ДИ>vector <int> nData;
ДИ>while(TRUE)
ДИ>{
ДИ>  try
ДИ>  {
ДИ>    nData.push_back(rand());
ДИ>  }
ДИ>  catch(bad_alloc ba) 
ДИ>  {
ДИ>    printf("bad alloactor!");
ДИ>  }
ДИ>}
ДИ>

ДИ>что результат её работы в NT-образных платформах одинаковый:
ДИ>через некоторое время выскакивает мессага "Out of memory"
ДИ>А мне бы хотелось ловить такие вещи в виде исключений (что бы было в стиле С++)
ДИ>Есть ли какой нибудь иной способ отлавливать невозможность выделить память
ДИ>(делать это до системы)? (а то следить за свободной памятью геморойно
ДИ>и неудобно — и вообще не в стиле С++)
ДИ>Спасибо за ответы.

Скорее всего у Вас VC6.0 В них оператор new не выкидывает исключение, а просто возвращает нулевой указатель.
Re[2]: какое исключение ловить?
От: Денис Ильин  
Дата: 16.02.04 10:44
Оценка:
В общем так:
проверил на всех компилерах: 5..7. В общем — отделив мухи от котлет я
понял — что это именно MFC. И ловить нужно было MFC-щные исключения.
Но вопрос про _set_new_handler остался — достаточно ли его в многопоточной
проге сделать один раз (Multithreaded CRTL как это воспринимает —
сразу на все потоки, или только на текущий)?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.