【发布时间】:2016-09-27 17:49:18
【问题描述】:
我看到我的团队中有很多人像这样检查空指针:
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 中应该如何检查 new 运算符返回的指针?
【问题讨论】:
-
它在 clang 中按预期工作
-
是的!它也适用于 vc++ 编译器。但我不知道为什么它不能在 gcc 中工作。
-
使用
GCC 6.1.0除非您将大小减小到合法数量,否则它不会编译。然后它按预期工作。 -
@Galik 我怎样才能知道法律限制是多少?你知道它在 gcc 4.9 中有多大吗?