Mishka> Забавно, а какое решение предложите Вы, когда не хватит памяти в программе для управления железом? Были у нас тяжёлые споры на эту тему с Владом (Сергей знает). Кучу статей нарыли, обсуждали. Надо будет покапаться, да найти их и выложить.
Да не забавно это. Стандарт С++ , выпущенный аж в 1998 году четко оговаривает поведение данной формы new. И практически все используемые компиляторы стараются его поддерживать. И он , стандарт, утверждает, что при ошибке связанной с выделением памяти new должен генерить exception bad_alloc. Отсюда следует, что код в if никогда выполнен не будет. И при ошибке нужно просто ловить исключение.
try {
char* pchar = new char[size];
...
}
catch( exception& ex )
{
cout << ex.what() << endl;
}
А если уж очень хочется использовать if, то и это невозбраняется стандартом. Для этого есть специальная форма new
char* pchar = new(nothrow) char[size];
if( !pchar) {
cout << "Error" << endl;
return 1;
}
Меня удивляет здесь другое. Но ладно я, который помнит еще "доисторические" компиляторы, у которых new возвращал NULL. Но откуда эта "доисторическая" память у молодых программистов? Кстати свои первые опыты по программированию я начинал еще на ДВК-2 с RT11SJ на паскалевском компиляторе от самого Вирта
Кстати об ошибках. RSX11 генерилась из дистрибутива и ей можно было подсунуть свой текст ошибок. Ну и ребята изголялись как могли. И я раз наблюдал такую картину: рядом девушка за терминалом вдруг покраснела, вскочила и убежала в слезах. Я подошел к терминалу и прочел текст ошибки "Не суетись под клиентом, клиент потеет". Перед девушкой потом долго извинялись, даже перегенерили систему, но к терминалу она больше не подходила