c++内存分配器vptr/new实现

c++ memory allocator vptr / new implementation

本文关键字:new 实现 vptr 内存 分配器 c++      更新时间:2023-10-16

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

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

这并没有为我设置vtable。我做了一些搜索,发现新的运算符可以占用大量内存。

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

这将初始化vptr。所以我想知道是否有办法自己分配vptr,或者这完全取决于编译器的突发奇想?

new(fx)MyClass()

这被称为"placement-new",实际上将调用构造函数来实际创建对象。

在您在分配的内存中创建该对象之前,它根本不存在(作为该类型的对象),因此它只是您将其转换为某个对象的原始非类型内存,这会导致未定义的行为。

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

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

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