我们会检查空指针来判断指针是否有效。一直以来,在申请动态内存后,我都会习惯性地检查得到的指针是否为空,但是查阅了一些资料后发现这个操作是多余的。

TIPS :在 C++ 标准中规定, new 关键字在失败时会抛出 std::bad_alloc 异常。

所以,不需要对 new 的返回值进行空指针判断, new 不会返回空指针,这点与C语言中的 malloc 有区别。C++中正确处理申请内存失败的写法如下。

try {
  Foo* p = new Foo;
}
catch (std::bad_alloc& e) {
  std::cout << "bad_alloc: " << e.what() << std::endl;
}

但是,以下几种情况例外。

  1. 编译器版本较老

旧版编译器(如VC6.0)可能对C++异常( std::exception )机制的支持不够好,导致在申请内存失败时仍会返回空指针。

  1. nothrow 关键字抑制异常的抛出

写法如下,加上了 std::nothrow 关键字之后, new 就不会抛出异常而是会返回空指针。

Foo* p = new (std::nothrow) Foo;
if (!p){
  std::cout << "fail to allocate" << std::endl;
}