【发布时间】:2015-11-24 02:39:50
【问题描述】:
我有一堂课:
class A
{
public:
void foo(void)
{
// equals to syntactically incorrect (&this == nullptr)
if (*(void**)this == nullptr)
return;
...
}
};
我是这样使用的:
A * a = new A;
...
delete a;
...
a->foo();
为什么true 仅适用于release 版本?如果我切换到 debug 版本,我通常会得到类似 0xFEEFEEFE 的信息。
编辑
好的,伙计们。你说的完全正确,我知道这一点。 未定义的行为是标准未指定的行为。 这就是每个平台都以自己的方式实现(但实现)的内容。
这个问题的目的是了解它是如何在 Windows 中实现的。此代码始终正常工作(“始终正常”意味着:在所有版本的 Windows(从 xp 开始)上,使用任何编译器调用该方法并且该语句为真))。就我而言,我想知道如果 在 Windows 中删除对象通常会发生什么。
附: 我应该在 wasm.ru 上问这个问题。对不起。
【问题讨论】:
-
未定义的行为是未定义的,不要做导致它的事情。
-
不,
*(void**)this不 等于&this。 -
a->foo()调用未定义的行为,因此任何事情都可能发生。 -
与in this other question 的主题相同。
-
唯一的中途“正确”方法是按原样测试
this,而不是在类型案例之后取消引用它,但即便如此,它也只是有点帮助,如果有的话 i>(我参与了一个项目,我们实际上这样做的原因除了几年前放支票的那个人之外没有人知道,但也没有人有动力删除它们)。该标准明确规定,在删除this后,您不得对它进行任何操作(包括查看它,如果您是迂腐的!)因此仅成员调用就已经深入 UB 领域,此后发生的任何检查都只是一个在黑暗中拍摄...