默认情况下,如果new不能分配说需要的内存空间,它会抛出一个类型为bad_alloc的异常。我们可以改变使用new的方式来阻止它抛出异常:
//如果分配失败,new返回一个空指针
int* p1 = new int; //如果分配失败,new抛出std::bad_alloc
int* p2 = new (nothrow) int; //如果分配失败,new返回一个空指针。
我们称这种形式的new为定位new。
定位new表达式允许我们向new传递额外的参数。如上面的nothrow。如果将nothrow传递给new.我们的意图是告诉它不能抛出异常。如果这种形式的new不能分配所需内存,它会返回一个空指针。
在c++早期版本中,有一个allocator类。其中的成员函数allocate负责分配内存空间,deallocate用来释放内存空间。但这两个函数不会构造或销毁对象。而是由construct函数来构造对象,用destroy函数来释放对象。
对于operator new分配的内存来说,我们无法用construct函数构造对象。相反,我们应该用new的定位new形式构造对象。
定位new的形式:
new (place_address) type
new (place_address) type (initializers)
new (place_address) type [size]
new (place_address) type [size] {braced initializer list}
其中place_address必须是一个指针。同时在initializers中提供一个(可能为空的)以逗号分隔的初始值列表