Effective C++(八)定制new和delete

来源:互联网 发布:茶隼武装直升机知乎 编辑:程序博客网 时间:2024/04/29 06:25

一 了解new-handler的行为:

(1)new-handler:当operator new抛出异常以反映一个未获满足的内存需求之前,它会先调用一个客户指定的错误处理函数。

(2)客户需要调用set_new_handler(声明与<new>一个标准程序库函数)以指定一个“用于处理内存不足”的函数。

*namespace std

{

typedef void (*new_handler)();

new_handler set_new_handler(new_handler p) throw ();

}

(3)当operator new无法满足内存申请时,会不断调用new-handler函数。

(4)一个设计好的new-handler必须做以下事情:

*让更多的内存可被使用。

*安装另一个new-handler:目前这个handler无法获得更多内存,但它知道两外哪个new-handler有此能力。

*卸除new-handler:将null指针传给set_new_handler。一旦没有安装任何new-handler,operator new会在内存分配不成功时抛出异常。

*抛出bad_alloc(或派生子bad_alloc)异常。这样的异常不会被operator new捕捉,因此会被传播到内存索求处。

*不返回:通常调用exit或abort。


二 了解new和delete的合理替换时机:

(1)重载operator new可以实现不同的内存分配行为。

(2)有许多理由需要写个new和delete:改善效能、对heap运用错误进行调试、收集heap使用消息。


三 编写new和delete时需固守常规:

(1)operator new应该内含一个无穷循环,并在其中尝试分配内存,如果它无法满足内存需求,就该调用new-handler。也应该有能力处理0bytes申请。class的专属版本还应该处理“比正确大小更大的(错误)申请”。

(2)operator delete应该在收到null指针时不做任何事情。class的专属版本则还需处理“比正确大小更大的(错误)申请”。


四 写了placement new也要写placement delete:

(1)写了placement new也要写placement delete。如果没有这么做,程序可能发生隐微而时断时续的内存泄露。

(2)当你声明placement new和placement delete,请确定不需要无意识地遮掩它们的正常版本。

原创粉丝点击