Оператор новый с параметром nothrow по-прежнему выдает исключение - PullRequest
6 голосов
/ 26 сентября 2011

Существует такой код:

#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 ]

7 голосов
/ 26 сентября 2011

0 должен быть отформатирован как "0". Это займет несколько байтов; Держу пари, что это причина. Поставьте точку останова на std::bad_alloc::bad_alloc, и вы точно будете знать.

1 голос
/ 26 сентября 2011

Я только что запустил ваш образец с VC2010.Это не новый (nothrow), который бросает, но __ security_check_cookie .

0 голосов
/ 26 сентября 2011

Это объясняет, почему он все еще бросает, и как вы можете заставить его не бросать. Кажется, nothrow просто игнорируется.

Если вы по-прежнему хотите использовать новую версию для C Runtime Library, которая не содержит метаний, свяжите вашу программу с nothrownew.obj Однако, когда вы связываетесь с nothrownew.obj, новое в стандартной библиотеке C ++ больше не будет работать.

Я нашел довольно подробную статью по этому поводу, но она немного устарела (VC 6), но, возможно, проблема все еще сохраняется. Кстати, VC игнорирует все throw() спецификации функций.

Когда оператор new (std :: nothrow) в любом случае создает исключение

...