表达式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
否则答案 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;
}