¿Por qué std :: nothrow no funciona como se esperaba en gcc (4.9)?
He visto a muchas personas en mi equipo comprobar punteros nulos como este:
SomeClass *pSc = new SomeClass;
if ( NULL == pSc )
{
// cope with error
}
Sabía que esto no funcionaría, porque el nuevo operador en c ++ genera una excepción std :: bad_alloc en lugar de devolver NULL. También sé que std :: nothrow puede hacer que lo que esperaban realmente suceda. Entonces escribí un ejemplo 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;
}
Sí, también quería demostrar el uso de std :: set_new_handler. Para mi sorpresa, incluso esto no funcionó. El nuevo operador todavía lanzó una excepción (std :: bad_array_new_length, una clase derivada de std :: bad_alloc) y luego finalizó el programa.
¿Alguna idea de por qué esto no funcionó?¿Cómo se deben verificar los punteros devueltos por el nuevo operador en gcc?