Sau*_*nda 6 c++ crash gcc undefined-behavior virtual-destructor
我在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;
}
Run Code Online (Sandbox Code Playgroud)
Cub*_*bbi 10
假设我的系统(GCC 4.6.0,Linux的x86_64的)上发生的事情是一样的你发生了什么(这也与崩溃data和不运行),实施的细节是,p它没有在分配的内存块的起点类型的对象derived.
正如valgrind告诉我,
Address 0x595c048 is 8 bytes inside a block of size 16 alloc'd
Run Code Online (Sandbox Code Playgroud)
如果您打印指针的值,您可以自己看到:
derived * d = new derived;
std::cout << d << '\n';
base *p = d;
std::cout << p << '\n';
Run Code Online (Sandbox Code Playgroud)
原因是gcc中的对象布局是{vtable,base,derived}
当base为空时,{vtable,base,derived}和{base}的大小恰好相同,因为分配空类的对象占用非零字节数,在两种情况下都恰好相同.
当派生没有虚函数时,vtable不存在,地址再次相同,删除成功.
| 归档时间: |
|
| 查看次数: |
1546 次 |
| 最近记录: |