条款51:编写 new 和 delete 时需固守常规
Adhere to convention when writing new and delete.
operator new
的返回值十分单纯,如果它有能力供应客户申请的内存,就返回一个指针指向那块内存;如果没有能力,就调用 new-handler 函数,直至成功或是抛出 bad_alloc 异常。
void* operator new(std::size_t size) throw(std::bad_alloc) {
using namespace std;
if (size == 0) {
size = 1;
}
while (true) {
尝试分配 size_t bytes;
if(分配成功)
return 一个指针,指向那块内存;
new_handler globalHandler = set_new_handler(0);
set_new_handler(globalHandler);
if (globalHandlder)
(*globalHandler)();
else
throw std::bad_alloc();
}
}
operator new
成员函数会被 derived class 继承,这会导致有可能 base class 的 operator new
被调用以分配 derived class 对象,为了避免这种情况,base class 专属的 operator new
需要判断大小:
void* Base::operator new(std::size_t size) throw(std::bad_alloc) {
if (size != sizeof(Base))
return ::operator new(size); // 使用标准 new 函数处理;
...
}
对于 operator new[]
,唯一要做的事情就是分配一块未加工内存(raw memory),因为你无法对 array 之内迄今为止尚未存在的元素对象做任何事情。
operator delete
只需记住的事情是保证“删除null指针永远正确“。
Last updated
Was this helpful?