调用特定于类的运算符new

时间:2010-06-21 10:56:00

标签: c++ memory

表达式operator new(sizeof(T))通过T分配::operator new字节,对吗?

有没有办法调用operator new 的特定于类的版本(如果它存在),这与new T()如何分配内存(在调用构造函数之前)的方式完全相同? / p> 如果T::operator new(sizeof(T))未定义T

operator new会产生编译时错误,即使T从定义它的基类继承。我想称之为:

    如果Foo::operator new定义Foo ,则
  • operator new
  • Base::operator new如果Foo派生自定义Base的{​​{1}}(我如何处理多重继承?)
  • operator new否则

2 个答案:

答案 0 :(得分:1)

标准库使用allocator对象解决了这个问题,该对象的类型被设置为需要可自定义分配算法的类的模板参数。

我认为没有任何完整的方法来完成你的要求,正如你的第二个子弹已经证明的那样。如果编译器都定义了一个,那么编译器无法知道哪个父运算符是新的。

如果你试图实现一个小的对象分配器池,它在编译时选择一个合适的大小/池,那么使用一个独立的模板分配器函数呢:它会被称为object_allocator<T>::allocate()和模板类型可以让你自动计算尺寸。由于多重继承问题,您仍然无法继承operator new,但它可以很容易地弄清楚如何在任何类中分配内存。

答案 1 :(得分:0)

定义不同的静态函数allocate并从T::operator new

调用此函数
class X {
public:
    static void * allocate(size_t size) {
           //...
    }
    void *operator new(size_t size) {
       return allocate(size);
    }
};

void f() {
   void * p = X::allocate(sizeof(X));
   X * x = new(p) X;
}