Оператор новый с параметром nothrow по-прежнему выдает исключение
Есть такой код:
#include <iostream>
int main(){
for(;;){
int* ptr = new (std::nothrow) int;
if(ptr == 0){
std::cout << 0 << std::endl;
break;
}
}
std::cin.get();
return 0;
}
Однако эта программа по-прежнему выдает исключение std::bac_alloc, хотя new вызывается с параметром std:: nothrow. Эта программа скомпилирована в Visual C++ 2010. Почему выдается исключение?
Редактировать:
Используя g ++ на Windows из mingw, все работает нормально.
3 ответа
Я только что запустил ваш образец с VC2010. Это не новый (nothrow), который бросает, но __security_check_cookie.
0
должен быть отформатирован как "0"
, Это займет несколько байтов; Держу пари, что это причина. Установить точку останова на std::bad_alloc::bad_alloc
и ты будешь знать наверняка.
Это объясняет, почему он все еще бросает и как вы можете заставить его не бросать. Похоже на то nothrow
просто игнорируется.
Если вы по-прежнему хотите использовать новую версию для библиотеки C Runtime, не создающую исключений, свяжите вашу программу с nothrownew.obj. Однако, когда вы связываетесь с nothrownew.obj, новое в стандартной библиотеке C++ больше не будет работать.
Я нашел довольно глубокую статью об этом, но она немного устарела (VC 6), но, возможно, проблема все еще сохраняется. Кстати, ВК игнорирует все throw()
спецификации функций.
Когда оператор new(std::nothrow) все равно создает исключение