








简单的说,就是单个对象和数组要区分对待。C++使用[]区分这是单个对象还是数组,所以new中有[]的时候,请用delete[]。
这条为了防止内存泄露,具体说来要做三件事情:
operator new申请内存得不到满足时,在抛出std::bad_alloc之前会调用用户设置的handler,该调用找到足够的内存才停止
typedef void(*new_handler)(); new_handler set_new_handler(new_handler p) throw(); |
因此,自己定义new handler需要遵循以下原则:
现在标准的operator new的行为时抛出一个std::bad_alloc的异常,其实,现在很少有情况会无法申请到内存,按照标准的做法即可。在抛出bad_alloc异常之后,做好log记录和分析,一旦遇到这种情况,加内存就是了。
自己写operator new,要和缺省的行为保持一致,详细说来,new应该遵循的公约如下:
void * operator new(size_t size) { if(size==0){ //1.大小为0的new也可以成功 size=1; } while(true){ //2.不断循环,尝试申请内存 if(alloc success) return *pointer //3.成功返回指针 //4.不成功,处理错误 new_handler globalHandler = set_new_handler(0); set_new_handler(globalHandler); if(globalHandler) (*globalHandler)(); else throw std::bad_alloc(); //5.没有处理函数,则抛异常 } } |
delete应该遵循的则很简单,即删除一个null指针永远是安全的
void operator delete(void * rawMemory) { if(rawMemory ==0 ) return; 否则再删除内存 } |
C++中,内部scope中的声明会遮掩外部的相同名称,条款9说明了一个特殊情况,自己写了一个定制的operator new,接收一个new_handler做额外的参数如下
void * operator new(size_t size, new_handler p) |
这个operator new会遮掩缺省的operator new,用户无法调用默认的new操作,针对这个情况,有两种解决方法,一种是再声明一个operator new(size_t size),另一种则是采用默认参数operator new(size_t size, new_handler p=0)
条款10其实说明使用operator new的原因:提高内存空间使用效率。
缺省的operator new需要在返回指针的前方使用一点空间记录该指针占用的大小(该空间称作cookie),用于delete的正常运行。自己重载operator new,则可以自己进行管理这个区块,减少内存使用
实现内存池,每次从内存池中申请,若内存池也不够的话,则扩张之
所以,写了一个operator new之后,要对应写一个operator delete,因为只有自己才知道到底是如何申请内存的。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。