hjk41的日志

Avatar

Effective C++ 笔记9: 重载操作符 new 时不要把“正常”的 new 格式给覆盖掉

如果我们重载了一个类的 operator new,那么我们对这个类进行 new 操作时就一定只会调用重载的 new 函数,看看下面的代码:

class A{
public:
    static void * operator new (size_t size, new_handler p);
}

void NoMoreMemory();

int main(){
    A * a1=new(NoMoreMemory) A;   // ok, calls A::operator new
    A * a2=new A;  // error! "function does not take 1 parameter"
    ...
}


为什么第二个出会错呢?因为我们重载了 operator new,所以只要我们对A进行 new 操作,那编译器就只会去 A 中找被重载的 new,而这里被重载的 new 只有一个,它必需带两个参数(其中 size 是系统自动加的),所以第二种用法会出错。
因为我们通常会用第二种用法,所以这里也就将它称为"正常"的 new。

怎么避免这种情况呢?最简单的方法就是再重载一个只带参数 size 的 operator new,如下:

class A{
public:
    static void * operator new (size_t size, new_handler p);
    static void * operator new (size_t size);
}

void NoMoreMemory();

int main(){
    A * a1=new(NoMoreMemory) A;   // ok, calls A::operator new (size_t size, new_handler p);
    A * a2=new A;  // ok, calls A:: operator new (size_t size);
    ...
}


另外一种方法就是用默认参数,如下:

class A{
public:
    static void * operator new (size_t size, new_handler p=0);
}


评论已关闭