在google cpp style guide里面明确指出:we don't use exceptions
C++11的noexcept关键字为这种选择提供了便利。
C++11以前,提及malloc和new的区别,总是会强调由malloc返回的指针需要检查是不是null,因为空间分配可能
失败,而由new返回的指针不用检查,因为如若分配失败,它会抛出异常,现在又提供了std::nothrow,使得我们
可以人让new不抛异常,而是返回nullptr表示分配失败,这在需要禁用异常的场合显得很实用,具体的例子如下:
// operator new example #include <iostream> // std::cout #include <new> // ::operator new struct MyClass { int data[100]; MyClass() {std::cout << "constructed [" << this << "]\n";} }; int main () { std::cout << "1: "; MyClass * p1 = new MyClass; // allocates memory by calling: operator new (sizeof(MyClass)) // and then constructs an object at the newly allocated space std::cout << "2: "; MyClass * p2 = new (std::nothrow) MyClass; // allocates memory by calling: operator new (sizeof(MyClass),std::nothrow) // and then constructs an object at the newly allocated space std::cout << "3: "; new (p2) MyClass; // does not allocate memory -- calls: operator new (sizeof(MyClass),p2) // but constructs an object at p2 // Notice though that calling this function directly does not construct an object: std::cout << "4: "; MyClass * p3 = (MyClass*) ::operator new (sizeof(MyClass)); // allocates memory by calling: operator new (sizeof(MyClass)) // but does not call MyClass's constructor delete p1; delete p2; delete p3; return 0; }
可见,只要把原来我们习惯的new T,改成 new (std::nothrow) T,就能使得我们的new expression不抛异常