我正在为我正在处理的项目制作一个内存池分配器。我的池分配器返回内存块,但是我的类继承自另一个类。
MyClass *fx = (MyClass*)pool->allocateEffect(sizeof(MyClass));
*fx = MyClass();
这不会为我设置vtable。我做了一些搜索,发现新的操作符可以占用大块内存。
MyClass *fx = (MyClass*)pool->allocateEffect(sizeof(MyClass));
fx = new(fx)MyClass();
这将初始化vptr。所以我想知道是否有任何方式来分配我自己的vptr还是完全由编译器突发奇想?
答案 0 :(得分:4)
new(fx)MyClass()
这称为“placement new”,实际上调用构造函数来实际创建一个对象。
直到你在你分配的内存中创建了那个对象,它根本不存在(作为那种类型的对象)所以它只是你投射到某个东西的原始无类型内存,这导致未定义的行为。
我建议您将函数设置为类似的模板。
template<class T>
T* allocateEffect() { return new (allocate_some_memory(sizeof(T))) T(); }
添加适当的可变参数模板并转发构造函数参数留给读者练习。