Вад, сорри я наврал (хотя цитата какой давности стандарта приведена я не знаю). Кстати о стандарте 2003 года мне ничего не известно и я сильно сомневаюсь что он есть... насколько мне известно последняя версия стандарта утвержденная комитетом датируется 1998 годом.
По стандарту, оператор new НИКОГДА не должен возвращать NULL - только бросать исключение - заблуждение. Стандарт гласит
:
5.3.4 New
. . . .
13 [Note: unless an allocation function is declared with an empty exception-specification (15.4), throw(), it indicates failure to allocate storage by throwing a bad_alloc exception (clause 15, 18.4.2.1); it returns a non-null pointer otherwise. If the allocation function is declared with an empty exception-specification, throw(), it returns null to indicate failure to allocate storage and a non-null pointer otherwise. ] If the allocation function returns null, initialization shall not be done, the deallocation function shall not be called, and the value of the new-expression shall be null.
Все определяется allocation function. Ни более, ни менее.
Можно писать так
A* a = new (nothrow) A();
тогда исключение бросаться не будет, хотя и это не совсем так. Это касается Standard Language Support Library. Но мы можем в любой момент перекрывать стандартные new'ы. Разумеется, Стандарт изо всех сил рекомедует бросать bad_alloc. Но возвращение NULL все еще официально возможно и без nothrow. Видите ли, у всех восьми операторов, описанных в <new> стоит примечание a C++ program may define a function with this function signature that displaces the default version defined by the C++ Standard library.
Все дело в том, что С++ отдает механизм аллоакции памяти на откуп программитсу (само-собой предоставляя default механизм, описанный в 18.4.1 Storage Allocation and Deallocation). Однако, как только пользователь берет этот механизм в свои руки (что явно и недвусмысленно разрешено Стандартом), то все начинает регулироваться 3.7.3.1 Allocation functions (цитировать не буду, слишком длинно). А там недвусмысленно прописано, что:
- может бросать bad_alloc, а может и возвращать null
- может вызывать new_handler, а может и не вызывать.
Так, что в конечном счете, все зависит от программиста, и Стандарт не запрещает возвращать null из new даже без nothrow.
Виноват исправлюсь )))