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,请确定不需要无意识地遮掩它们的正常版本。
- Effective C++(八)定制new和delete
- Effective C++(八)定制new和delete
- effective C++: 8.定制new和delete
- 《Effective C++》定制new和delete
- effective C++读书笔记八 —— 定制new 和delete
- <<Effective C++>>读书笔记8: 定制new和delete
- (Effective C++)第八章 定制new和delete(Customizing new and delete)
- Effective C++读书笔记---定制new和delete
- Effective C++ 8. 定制 new 和 delete
- [C++]定制new和delete
- Effective C++ 3nd 读书摘要(八、定制new和delete)Item49 - 52
- Effective C++读书笔记 第八部分 定制new和delete
- Effective C++ --8 定制new和delete && 9杂谈讨论
- Effective C++ 第八章(定制new和delete)
- Effective C++ 笔记 第八部分 定制new和delete
- Effective C++笔记(11)—定制new和delete
- More Effective C++:不同new和delete
- More Effective C :理解new和delete
- 我第一次用SSH2框架做**管理系统(1)
- V4L2
- 如果你只会Java、那任何事情看起来都是类
- Effective C++(七)模板与泛型编程
- 10341 - Solve It
- Effective C++(八)定制new和delete
- Ubantu IBUS输入法翻页快捷键设置
- REST
- SlidingMenu-master中的example怎样导入eclipse运行
- 从一段c程序的优化说起
- 阻碍你成功的20个最令人反感的坏习惯
- sql server安装程序遇到以下错误:
- 深度比较Map的遍历
- 进程同步与PV操作