Por que o std :: nothrow não funciona como esperado no gcc (4.9)?

Já vi muitas pessoas na minha equipe verificando ponteiros nulos como este:

    SomeClass *pSc = new SomeClass;
    if ( NULL == pSc )
    {
        // cope with error
    }

Eu sabia que isso não funcionaria, porque o novo operador em c ++ lança uma exceção std :: bad_alloc em vez de retornar NULL. Eu também sei que std :: nothrow pode fazer o que eles esperavam realmente acontecer. Então, eu escrevi um exemplo como este:

    #include <iostream>
    #include <limits>
    #include <new>
    using namespace std;

    void myNewHandler()
    {
        std::cerr << "Failed to allocate memory!" << std::endl;
    }

    int main(int argc, char* argv[])
    {
        //std::new_handler oldHandler = std::set_new_handler(myNewHandler);

        int *pLotsMem = new(std::nothrow) int[std::numeric_limits<long long>::max()];
        if ( nullptr == pLotsMem )
        {
            std::cerr << "Allocation failed" << std::endl;
            return -1;
        }
        else
        {
            delete[] pLotsMem;
            pLotsMem = nullptr;
        }

        //std::set_new_handler(oldHandler);

        return 0;
    } 

Sim, eu queria demonstrar o uso de std :: set_new_handler também. Para minha surpresa, mesmo isso não funcionou. O novo operador ainda lançou uma exceção (std :: bad_array_new_length, uma classe derivada de std :: bad_alloc) e finalizou o programa.

Alguma idéia de por que isso não funcionou?Como verificar os ponteiros retornados pelo novo operador no gcc?

questionAnswers(1)

yourAnswerToTheQuestion