我見過很多人在我的團隊檢查的空指針這樣的:爲什麼std :: nothrow在gcc(4.9)中按預期工作?
SomeClass *pSc = new SomeClass;
if (NULL == pSc)
{
// cope with error
}
我知道這是行不通的,因爲在C++ new操作符拋出一個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中新運算符返回的指針?
它在叮噹中按預期工作 –
是的!它也適用於vC++編譯器。但我不知道爲什麼它無法在gcc中工作。 –
使用'GCC 6.1.0',它不會編譯,除非您將大小減小到合法數量。然後它按預期工作。 – Galik