【发布时间】:2011-09-03 13:26:01
【问题描述】:
我在 gcc 4.4.5 上尝试了以下代码。
如果成员 'data' 不存在,则代码可以正常执行,但如果存在,则会崩溃。当派生类的 dtor 不是虚拟的时,它也不会崩溃。
我知道 在这两种情况下,行为都是未定义的,如 C++03 (5.3.5 / 3) 中所列,但仍然有人可以向我解释为什么会这样在后一种情况下它会崩溃?
是的,我知道 UB 意味着任何事情都可能发生,但仍然我想知道特定于实现的细节。
#include<iostream>
using std::cout;
struct base{
int data;
base(){
cout << "ctor of base\n";
}
~base(){
cout << "dtor of base\n";
}
};
struct derived : base{
derived(){
cout << "ctor of derived\n";
}
virtual ~derived(){
cout << "dtor of derived\n";
}
};
int main(){
base *p = new derived;
delete p;
}
【问题讨论】:
-
由于这是 UB,“诊断”的唯一方法是查看为您的特定平台生成的程序集。我不确定这样做会得到什么!
-
几乎不可能说 - 在我的 g++ 4.5.1 安装中,例如它似乎运行正常。关于 UB 的全部意义在于它就是 UB。
-
了解崩溃的发生方式/原因将给您带来什么好处?您将无法在任何其他编译器版本中可靠地使用该信息;您可能无法在其他平台上使用相同的编译器版本。
-
“它似乎有时会起作用”,但已知是 UB。问题是什么?
-
我认为你应该停止移动鼠标。拔掉电源还会死机吗?
标签: c++ gcc crash undefined-behavior virtual-destructor