当 operator new 没有能力为分配出咱们所申请的 memory,会抛出一个 std::bad_alloc exception。某些老编译器则是返回 0 ,现代编译器仍然能够这样作:new (nothrow) Foo;
ios
抛出 exception 以前会先(不止一次)调用一个可有 client 指定的 handler, 如下是 new handler 的形式和设定方法:函数
typedef void (*new_handler)(); new_handler set_new_handler(new_handler p) throw();
设计良好的 new_handler 只有两个选择:测试
abort()
或 exit()
void *operator_new(size_t size, const std::nothrow_t &_THROW0()) { // try to allocate size bytes void *p; while ((p = malloc(size)) == 0) { // buy more memory or return null pointer _TRY_BEGIN if (_callnew_h(size) == 0) break; _CATCH(std::bad_alloc) return 0; _CATCH_END } return (p); }
#include <new> #include <iostream> #include <cassert> using namespace std; void onMoreMemory() { cerr << "out of memory" << endl; abort(); } int main() { set_new_handler(onMoreMemory); int *p = new int[10000]; assert(p); cout << p << endl; p = new int[100000000000000]; assert(p); cout << p << endl; return 0; }
输出[gcc version 7.5.0]spa
0x55ad89dd7e70 out of memory Aborted (core dumped)
本例中 new handler 中若是没有调用 abort(), 执行后 cerr 会不断出现 "out of memory", 需强制中断。这样的表现是正确的,表示当 operator new 没法知足申请量时,会不断调用 new handler 直到获得足够 memory.设计
default、delete 不只适用于构造函数(拷贝构造、移动构造)和赋值函数(拷贝赋值、移动赋值)code
class Foo { public: Foo() = default; Foo(const Foo&) = delete; Foo& operator=(const Foo&) = delete; ~Foo() = default; };
实际测试:ci
#include <iostream> using namespace std; class Foo { public: long _x; public: Foo(long x = 0) : _x(x) { } // static void *operator new(size_t size) = default; // error: only special member functions may be defaulted // static void operator delete(void *pdead, size_t size) = default; // error: only special member functions may be defaulted static void *operator new[](size_t size) = delete; static void operator delete[](void *pdead, size_t size) = delete; }; int main() { // Foo *p1 = new Foo[10]; // error: call to deleted function 'operator new[]' // delete [] p1; // error: attempt to use a deleted function return 0; }