条款8:写operator new和operator delete时要遵循常规
来源:互联网 发布:html5自适应源码 编辑:程序博客网 时间:2024/06/03 20:52
1. 首先我被一个问题所困恼:条款7中的operator new是这么写的,但条款8中的new却多了一个while。回头再仔细看下条款7,原来条款7中的operator new只处理了第一次分配内存失败的异常。
//条款7中的operator newtemplate<class T> void* NewHandlerSupport<T>::operator new(size_t size) { void* memory = NULL; new_handler old_handler = ::set_new_handler(current_handler); try { memory = ::operator new(size); } catch (std::bad_alloc&) { set_new_handler(old_handler); throw; } set_new_handler(old_handler); return memory; }
2. operator new要遵循哪些常规:a)要有正确的返回值. b)内存不够异常处理. c)处理请求0字节内存分配. d)避免隐藏标准new. e) 非类成员的operator new 和类成员的operator new区别. 其看起来会像下面这样:
//条款8中非类成员的operator newvoid* operator new(size_t size){if(0 == size){size = 1;}while(1){new_handler handler = NULL;void* memory = NULL;handler = set_new_handler(NULL);set_new_handler(handler);memory = ::operator new(size);if(NULL != memory)return memory;if(handler) (*handler)();else throw std::bad_alloc();}}
//条款8中类成员的operator newclass X{public: static void* operator new(size_t size); //...private: //...};void* X::operator new(size_t size){ if(size != sizeof(X)) //如果X的子类的size大于sizeof(X) return ::operator new(size); /*if(0 == size) { size = 1; }*/ while(1) { new_handler handler = NULL; void* memory = NULL; handler = set_new_handler(NULL); set_new_handler(handler); memory = ::operator new(size); if(NULL != memory) return memory; if(handler) (*handler)(); else throw std::bad_alloc(); }}3. operator delete要遵循哪些常规:a)C++保证删除空指针永远是安全的,意味着我们只需要保证我们的指针不是野指针就无大碍. b)同样的非类成员的operator delete和类成员的operator delete有区别.
//非类成员的operator deletevoid operator delete(void* memory){ if(NULL == memory) return; ::operator delete(memory); return;}//类成员的operator deleteclass X{public:static void* operator new(size_t size);static void operator delete(void* memory, size_t size);//...private://...};void X::operator delete(void* memory, size_t size){if(NULL == memory)return;if(size != sizeof(X))//如果X的子类的size大于sizeof(X){::operator delete(memory);//标准的deletereturn;}//自定义的delete,这里也调用标准的delete::operator delete(memory);}
- 条款8: 写operator new和operator delete时要遵循常规
- effective C++笔记之条款8: 写operator new和 operator delete 时要遵循常规
- 条款8:写operator new和operator delete时要遵循常规
- Effective C++:条款8: 写operator new和operator delete时要遵循常规
- 条款8:写operator new和operator delete时要遵循常规
- 写operator new和operator delete时要遵循常规
- Effective C++学习笔记:写operator new和operator delete时要遵循常规
- new operator和delete operator
- operator new 和 operator delete
- operator new 和 operator delete
- operator new和operator delete
- operator new和operator delete
- new/delete operator和operator new/delete
- 写operator new和operator delete的规则
- operator new 和 delete
- 条款10: 如果写了operator new就要同时写operator delete
- 条款10:如果写了operator new就要同时写operator delete
- C++ 的 new 和 delete : new operator, operator new, placement new, delete operator, operator delete
- 如何在 64 位 linux 机器上安装 jdk1.6?
- 超棒的javascript移动触摸设备开发类库 - QUOjs
- aaaaaaaaaaaaaaaa
- Using Python as PDF Editing and Processing Framework
- CSS截取字符串,将多余文字用省略号显示
- 条款8:写operator new和operator delete时要遵循常规
- 使用SQL2005 递归查询结合Row_Number()实现完全SQL端树排序
- Windows系统默认调试器设置
- cookie
- C语言中可变参数函数的设计
- 随笔
- bbbbbbbbbbbbbbbb
- java.lang.Process 阻塞问题
- 2011~2012,我曾经追过的代码