C++自定义删除运算符不能正常工作?

C ++ custom delete operator does not work well?

本文关键字:工作 常工作 自定义 删除 运算符 不能 C++      更新时间:2023-10-16

首先要说的是,我是西班牙人,我的英语真的很差,我用了一个翻译,我很抱歉看起来像一个文盲:)


我已经很多年没有玩过c ++了,我已经忘记了很多,也许我的怀疑或可能的失败确实是语言中的基本内容。

我编写了一个小代码来使用虚拟析构函数在 c++ 中测试删除运算符的开销,我发现它仅在第一次调用 delete 时才能正常工作。

代码在这里(这是一个允许您在线编写代码并执行它的页面,我已经在Visual Studio和gcc中对其进行了测试,并且完全相同(:https://onlinegdb.com/SkiI1dNDQ

有人可以告诉我为什么会这样吗?只有第一次效果很好,第二次进展不顺利

我也把代码放在这里,它给出的结果:

#include <stdio.h>
class Base
{
public:
virtual ~Base() { printf("~Basern"); }
void operator delete(void *m) { printf("delete Basern"); }
};
class Derived : public Base
{
public:
Derived() { x = 1; }
~Derived() { printf("~Derivedrn"); }
void operator delete(void *m) { printf("delete Derivedrn"); }
int x;
};
int main()
{
Derived *derived = new Derived();
printf("1) delete derived (%i)rn", ((Derived*)derived)->x);
delete derived;
printf("2) delete derived (%i)rn", ((Derived*)derived)->x);
delete derived;
return 0;
}

结果:

1) delete derived (1)
~Derived
~Base
delete Derived
2) delete derived (1)
~Base
delete Base

现在,如果我们删除名为"Base"的"虚拟"类,那么从逻辑上讲,每当我们使用"Derived"调用删除时(代码已准备好删除虚拟并且没有任何失败(。要执行它:https://onlinegdb.com/SkXkgdVP7

谢谢

Derived *derived = new Derived();
printf("1) delete derived (%i)rn", ((Derived*)derived)->x);
delete derived;
printf("2) delete derived (%i)rn", ((Derived*)derived)->x);
delete derived;

上面的代码不正确,并且正在调用未定义的行为。 一个对象只能删除一次;上面您(尝试(删除同一对象两次。 问题是,在第一次调用删除之后,derived现在是一个悬而未决的指针(即它不再指向有效对象(,并且尝试以任何方式取消引用它是一个错误(包括调用delete它(。