C++自定义删除运算符不能正常工作?
C ++ custom delete operator does not work well?
首先要说的是,我是西班牙人,我的英语真的很差,我用了一个翻译,我很抱歉看起来像一个文盲:)
我已经很多年没有玩过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
它(。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- sdl软件渲染器不工作,工作在硬件加速的一个
- C++程序已停止工作-求解常微分方程