无法在使用malloc / placement new创建的类上调用虚拟函数

时间:2019-04-05 16:51:58

标签: c++ memory-management new-operator vtable placement-new

我试图为自定义分配器编写new / delete函数,但是无论何时调用虚拟函数,使用new放置初始化的对象都会抛出“访问冲突执行位置”。

当我尝试分配两个相同类的对象时,一个分配给new的对象,另一个分配给new的对象,它们的vptrs指向相同的函数,但是只有使用new创建的对象才能执行该函数。

//Definition not shown
class Component
{
public:
    Component() {}
    virtual void Update() {}
    virtual void Init() {}


};

//Definition not shown
class MeshComponent :
    public Component
{
public:
    virtual void Update() override;
    virtual void Init() override;
};


#define fnew(T,...) new (malloc(sizeof(T))) T (__VA_ARGS__);

MeshComponent* newComponent = fnew(MeshComponent);
MeshComponent* newComponent2 = new MeshComponent();

newComponent2->Update(); //Runs like expected
newComponent->Update();  //Access violation executing location

知道这是为什么吗?

1 个答案:

答案 0 :(得分:0)

好吧,我重新启动了Visual Studio,现在可以正常工作了... 谢谢您的见解。