Почему std :: nothrow не работает должным образом в gcc (4.9)?
Я видел много людей в моей команде, проверяющих нулевые указатели, подобные этому:
SomeClass *pSc = new SomeClass;
if ( NULL == pSc )
{
// cope with error
}
Я знал, что это не будет работать, потому что новый оператор в c ++ генерирует исключение std :: bad_alloc вместо возврата NULL. Я также знаю, что std :: nothrow может сделать то, что они ожидали, действительно. Итак, я написал такой пример:
#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;
}
Да, я также хотел продемонстрировать использование std :: set_new_handler. К моему удивлению, даже это не сработало. Оператор new по-прежнему генерирует исключение (std :: bad_array_new_length, производный класс std :: bad_alloc) и затем завершает работу программы.
Есть идеи, почему это не сработало?Как проверять указатели, возвращаемые новым оператором в gcc??