《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的情况下的考虑,如果不怕辛苦可以为派生类设计一套内存方案。
一个示例:
2.如果设计operator new[],则应当分配尽量多的内存。
3.如果设计operator delete,则应当保证“删除空指针永远安全”,做法是在该函数中检查指针是否为空。
(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,则应当保证“删除空指针永远安全”,做法是在该函数中检查指针是否为空。
相关文章推荐
- Effective C++ 3e----new & delete(八)条款51:编写new和delete时需固守常规
- effective C++ 条款 51:编写new和delete时需固守常规
- Effective C++ 条款51 编写new和delete时需固守常规
- C++之编写new和delete时需要固守常规(51)---《Effective C++》
- 《Effective C++》:条款51:编写new和delete时需固守常规
- Effective C++ -----条款51:编写new 和delete 时需固守常规
- Effective C++ 条款 51:编写new和delete时需固守常规
- effective C++ 条款 51:编写new和delete时需固守常规
- 条款51:编写new和delete时需固守常规
- 条款51:编写new和delete需固守常规
- 条款51:编写new和delete时需固守常规(Adhere to convention when writing new and delete.)
- 【51】编写new和delete时需固守常规
- 条款51:编写new和delete时需固守常规
- 编写new和delete时需固守常规
- 条款51:编写new和delete时需固守常规
- 条款51:编写new以及delete的时候需要固守常规
- effective C++ 条款 50:了解new和delete的合理替换时机
- [翻译] Effective C++, 3rd Edition, Item 51: 编写 new 和 delete 时要遵守惯例
- Effective C++ 读书笔记之Part8.Customizing new and delete
- Effective c++ 条款3、6:new、delete和malloc、free