条款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?