Исходя из спецификации C ++, он всегда будет выдавать std :: bad_alloc, когда вы используете просто новый, без параметров, но, конечно, могут быть некоторые несовместимые компиляторы.
Я бы не стал кодировать для совместимости с компиляторами, не совместимыми с c ++. VC6 является одним из них в этом отношении.
Рекомендуется всегда устанавливать указатель на NULL после их удаления. Поэтому из-за этого проверка на NULL все еще необходима.
Как говорится, вот несколько вариантов очистки вашего кода:
Вариант 1: установка собственного нового обработчика
Безопасный способ очистить ваш код - это сначала позвонить: set_new_handler .
Тогда вы можете проверить NULL в вашем обработчике и бросить туда std :: bad_alloc, если возвращается NULL.
Если вам больше нравятся исключения, тогда это ваш лучший выбор. Если вам нравится возвращать NULL лучше, вы также можете сделать это, выполнив перехват в вашем новом обработчике.
Вариант 2: использование перегруженного нового
Стандартный заголовочный файл c ++ определяет struct nothrow, которая является пустой. Вы можете использовать объект этой структуры внутри new, чтобы получить его перегруженную версию, которая всегда возвращает NULL.
void* operator new (size_t size, const std::nothrow_t &);
void* operator new[] (void *v, const std::nothrow_t &nt);
Так в вашем коде:
char *p = new(std::nothrow) char[1024];
Вот хорошая ссылка для дальнейшего чтения