您的位置:首页 > 编程语言 > C语言/C++

《Effective C++》读书笔记之item51:编写new和delete时需固守常规

2012-09-03 20:34 232 查看
1.当用户自定义operator new时,应当满足以下要求:

(1)operator new应当包含一个无穷循环,并在其中尝试分配内存,如果分配失败,就应当调用new-handler。

(2)同时它应当有能力处理0-byte申请,一种常见做法是将它视为1-byte申请。C++规定,即使客户要求0字节,operator new也应该返回一个合法指针。

(3)类专属版本的operator new应该处理“比正确大小更大的(错误)申请”。注意对基类适用的内存分配方案可能对派生类不适用,如果一个类被继承,它的派生类很可能调用基类的operator new,防止这种情况出现的方法是在该函数中增加一个判断:判断该类是否为基类(通过sizeof()取大小来比较判断),如果不是则调用全局版本。

PS:我想调用全局版本可能并不是最好的方法,之所以这样做可能是在不给派生类添加专属operator new的情况下的考虑,如果不怕辛苦可以为派生类设计一套内存方案。

一个示例:

void* operator new(std::size_t size) throw(std::bad_alloc){
using namespace std;
if(size == 0){//如果客户申请0位内存,则自动转换为1位的内存
size = 1;
}
while(true){
…//无穷循环,尝试分配size bytes
if(…)//分配成功
return …;//一个指针,指向分配得到的内存
//分配失败,找到目前的new-handler函数
new_handler globalHandler = set_new_handler(0);
set_new_handler(globalHandler);//这两步是为了取得new-handler函数的指针
if(globalHandler)(*globalHandler)();
else throw std::bad_alloc();
}


2.如果设计operator new[],则应当分配尽量多的内存。

3.如果设计operator delete,则应当保证“删除空指针永远安全”,做法是在该函数中检查指针是否为空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: