Warum funktioniert std :: nothrow in gcc (4.9) nicht wie erwartet?

Ich habe viele Leute in meinem Team gesehen, die Nullzeiger wie folgt überprüft haben:

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

Ich weiß, dass dies nicht funktioniert, da der neue Operator in c ++ eine std :: bad_alloc-Ausnahme auslöst, anstatt NULL zurückzugeben. Ich weiß auch, dass std :: nothrow bewirken kann, was sie erwartet haben. Also schrieb ich ein Beispiel wie dieses:

    #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;
    } 

Ja, ich wollte auch die Verwendung von std :: set_new_handler demonstrieren. Zu meiner Überraschung funktionierte auch dies nicht. Der neue Operator hat immer noch eine Ausnahme ausgelöst (std :: bad_array_new_length, eine abgeleitete Klasse von std :: bad_alloc) und dann das Programm beendet.

Eine Idee, warum dies nicht funktioniert hat?Wie soll man die vom neuen Operator in gcc @ zurückgegebenen Zeiger überprüfe?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage