c ++ memory allocator vptr / new implementation

时间:2014-04-29 15:01:03

标签: c++ memory-management

我正在为我正在处理的项目制作一个内存池分配器。我的池分配器返回内存块,但是我的类继承自另一个类。

    MyClass *fx = (MyClass*)pool->allocateEffect(sizeof(MyClass));
    *fx = MyClass();

这不会为我设置vtable。我做了一些搜索,发现新的操作符可以占用大块内存。

    MyClass *fx = (MyClass*)pool->allocateEffect(sizeof(MyClass));
    fx = new(fx)MyClass();

这将初始化vptr。所以我想知道是否有任何方式来分配我自己的vptr还是完全由编译器突发奇想?

1 个答案:

答案 0 :(得分:4)

new(fx)MyClass()

这称为“placement new”,实际上调用构造函数来实际创建一个对象。

直到你在你分配的内存中创建了那个对象,它根本不存在(作为那种类型的对象)所以它只是你投射到某个东西的原始无类型内存,这导致未定义的行为。

我建议您将函数设置为类似的模板。

template<class T>
T* allocateEffect() { return new (allocate_some_memory(sizeof(T))) T(); }

添加适当的可变参数模板并转发构造函数参数留给读者练习。