Здравствуйте, Вы писали:
> Седьмая студия?
7.1
> А Винда какая? Тоже интересно.
XP Professional Sp1
Posted via RSDN NNTP Server 1.7 "Bedlam"
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
ПК>Чуть-чуть модифицировал, чтобы быстрее память съедала:
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 >>
В общем — рассказываю в чём было дело.
Наверняка кому нибудь понадобится.
Во первых, все эти 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] и т.п. для выделения фрагментов кода. -- ПК.
Здравствуйте, Денис Ильин, Вы писали:
ДИ>Добрый день. Есть интересный вопросец.
ДИ>минипрограмка
ДИ>ДИ>vector <int> nData;
ДИ>while(TRUE)
ДИ>{
ДИ> try
ДИ> {
ДИ> nData.push_back(rand());
ДИ> }
ДИ> catch(bad_alloc ba)
ДИ> {
ДИ> printf("bad alloactor!");
ДИ> }
ДИ>}
ДИ>
ДИ>что результат её работы в NT-образных платформах одинаковый:
ДИ>через некоторое время выскакивает мессага "Out of memory"
ДИ>А мне бы хотелось ловить такие вещи в виде исключений (что бы было в стиле С++)
ДИ>Есть ли какой нибудь иной способ отлавливать невозможность выделить память
ДИ>(делать это до системы)? (а то следить за свободной памятью геморойно
ДИ>и неудобно — и вообще не в стиле С++)
ДИ>Спасибо за ответы.
Скорее всего у Вас VC6.0 В них оператор new не выкидывает исключение, а просто возвращает нулевой указатель.