由new创建的指针不需要检查nullptr
我们会检查空指针来判断指针是否有效。一直以来,在申请动态内存后,我都会习惯性地检查得到的指针是否为空,但是查阅了一些资料后发现这个操作是多余的。
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;
}
但是,以下几种情况例外。
- 编译器版本较老
旧版编译器(如VC6.0)可能对C++异常( std::exception
)机制的支持不够好,导致在申请内存失败时仍会返回空指针。
- 用
nothrow
关键字抑制异常的抛出
写法如下,加上了 std::nothrow
关键字之后, new
就不会抛出异常而是会返回空指针。
Foo* p = new (std::nothrow) Foo;
if (!p){
std::cout << "fail to allocate" << std::endl;
}