当 operator new 没有能力为调配出咱们所申请的 memory,会抛出一个 std::bad_alloc exception。某些老编译器则是返回 0 ,古代编译器依然能够这样做:new (nothrow) Foo;
抛出 exception 之前会先(不止一次)调用一个可有 client 指定的 handler, 以下是 new handler 的模式和设定办法:
typedef void (*new_handler)();new_handler set_new_handler(new_handler p) throw();
设计良好的 new_handler 只有两个抉择:
- 让更多的 memory 可用
- 调用
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]
0x55ad89dd7e70out of memoryAborted (core dumped)
本例中 new handler 中如果没有调用 abort(), 执行后 cerr 会一直呈现 "out of memory", 需强制中断。这样的体现是正确的,示意当 operator new 无奈满足申请量时,会一直调用 new handler 直到失去足够 memory.
default、delete
default、delete 不仅实用于构造函数(拷贝结构、挪动结构)和赋值函数(拷贝赋值、挪动赋值)
class Foo {public: Foo() = default; Foo(const Foo&) = delete; Foo& operator=(const Foo&) = delete; ~Foo() = default;};
理论测试:
#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;}