Оператор новый с параметром 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) все равно создает исключение

Другие вопросы по тегам