我试图为我的自定义分配器编写新的/删除的函数,但每当调用虚函数时,使用 placement new 初始化的对象都会抛出“访问冲突执行位置”。
当我尝试分配同一类的两个对象时,一个使用 new,另一个使用 placement 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
知道这是为什么吗?
好吧,我重新启动了 Visual Studio,它现在可以正常工作了……感谢大家的洞察力。
我是一名优秀的程序员,十分优秀!