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

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

我试图为我的自定义分配器编写新的/删除的函数,但每当调用虚函数时,使用 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,它现在可以正常工作了…… 感谢大家的洞察力。

关于c++ - 无法在使用 malloc/placement new 创建的类上调用虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55540134/

相关文章:

c# - new 关键字隐藏虚方法实现的实际用法? C#

c++ - 为什么需要间接寻址

c++ - 重载括号运算符有什么作用?

c++ - 在 C++ 类中,使用 "this"访问成员变量有什么区别

python 在磁盘上存储实时变量

javascript - 有什么好处! (双不)运算符?

c++ - Arduino 的新运算符(operator)

c++ - 声明一个 int 变量

c++ - 如果存在内存分配错误,请从 mex 文件中正常退出

c++ - C++ 对象的生命周期是什么?