我有以下循环(当使用 delete[] 删除 SgApp 类型的 24 个对象的数组时会发生这种情况)
0x086f5361 <+45>: cmp ebx,DWORD PTR [esi+0x4]
0x086f5364 <+48>: je 0x86f5375 <PSM::~PSM()+65>
0x086f5366 <+50>: sub ebx,0xd4
0x086f536c <+56>: mov eax,DWORD PTR [ebx]
0x086f536e <+58>: mov DWORD PTR [esp],ebx
=> 0x086f5371 <+61>: call DWORD PTR [eax]
0x086f5373 <+63>: jmp 0x86f5361 <PSM::~PSM()+45>
在这段代码中,%ebx 就像一个迭代器,%esi 指向数组的开头并且 sizeof(SgApp)=0xd4。在数组的开头,前 4 个字节表示数字 24。行0x086f5371 <+61>: call DWORD PTR [eax]
调用 SgApp 默认的虚拟析构函数。
从这段代码中,我了解到对象的第一个 DWORD 指向一个 vtable,而 vtable 中的第一个 DWORD 指向析构函数。这个对吗?每次我有一个虚拟析构函数时都会发生这种情况?
在什么情况下调用析构函数会导致该行出现信号 11 段错误
0x086f5371 <+61>: call DWORD PTR [eax]
?我的猜测是 %eax 指向的值在某个未分配的区域中,但可能的原因是什么?此时我应该拥有所有 24 个 SgApp 类型的对象(它们是在构造函数中创建的)。
我提到这个信号 11 只发生了一次,我得到的只是一个糟糕的核心转储。在正常情况下,这是不可重现的,所以我正在寻找所有可能的解释,包括一些硬件故障或一些奇异的场景。