Item 51:写new和delete时请遵循惯例
Posted harttle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Item 51:写new和delete时请遵循惯例相关的知识,希望对你有一定的参考价值。
外部operator new
void * operator new(std::size_t size) throw(std::bad_alloc)
if(size == 0) size = 1;
while(true)
// 尝试申请
void *p = malloc(size);
// 申请成功
if(p) return p;
// 申请失败,获得new handler
new_handler h = set_new_handler(0);
set_new_handler(h);
if(h) (*h)();
else throw bad_alloc();
成员operator new
class Base
public:
static void* operator new(std::size_t size) throw(std::bad_alloc);
;
class Derived: public Base...;
Derived *p = new Derived; // 调用了 Base::operator new !
void *Base::operator new(std::size_t size) throw(std::bad_alloc)
if(size != sizeof(Base)) return ::operator new(size);
...
外部operator delete
void operator delete(void *rawMem) throw()
if(rawMem == 0) return;
// 释放内存
成员operator delete
class Base
public:
static void * operator new(std::size_t size) throw(std::bad_alloc);
static void operator delete(void *rawMem, std::size_t size) throw();
;
void Base::operator delete(void *rawMem, std::size_t size) throw()
if(rawMem == 0) return; // 检查空指针
if(size != sizeof(Base))
::operator delete(rawMem);
// 释放内存
Base *p = new Derived; // 假设Base::~Base不是虚函数
delete p; // 传入`delete(void *rawMem, std::size_t size)`的`size == sizeof(Base)`。
本文地址:http://harttle.com/2015/09/20/effective-cpp-51.html
以上是关于Item 51:写new和delete时请遵循惯例的主要内容,如果未能解决你的问题,请参考以下文章