Effective C++(八)定制new和delete
2013-06-10 17:05
477 查看
一 了解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,请确定不需要无意识地遮掩它们的正常版本。
(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(Customizing new and delete)
- Effective C++(八)定制new和delete
- Effective C++笔记(11)—定制new和delete
- Effective C++ 3nd 读书摘要(八、定制new和delete)Item49 - 52
- <<Effective C++>>读书笔记8: 定制new和delete
- C++(8)定制new和delete
- More Effective C++----(8)理解各种不同含义的new和delete
- [Effective C++]定制new和delete
- Effective C++学习笔记:对应的new和delete要采用相同的形式
- 如何写出高效C++(定制new和delete和杂项讨论)
- 读书笔记_Effective_C++_条款十六:成对使用new和delete时要采取相同的形式
- Item 16: Use the same form in corresponding uses of new and delete.(Effective C++)
- Item 8:Understand the different meanings of new and delete.(More Effective C++)
- Effective C++条款3:尽量用new和delete而不用malloc和free
- 8.定制new和delete
- Effective C++——》条款16:成对使用new和delete时要采取相同的形式
- More Effective C++:不同new和delete
- 《Effective C++第三版》读书笔记——定制new和delete
- Effective C++读书笔记---定制new和delete
- effective C++ 学习 (Customizing new and delete)