我有以下循环(这发生在类型SgApp 24级的对象的阵列与删除[]删除)析构函数调用中信号11的可能原因是什么?
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默认虚拟析构函数。
从这个代码据我所知,一个对象指向一个虚函数表和从V表指向析构函数的第一个DWORD的第一个DWORD。它是否正确?每次我有虚拟析构函数时都会发生这种情况?
在什么情况下,这个析构函数的调用会导致信号11 seg fault在这个确切的线
0x086f5371 <+61>: call DWORD PTR [eax]
?我的猜测是%eax指向的值在某个未分配区域,但是可能的原因是什么?此时我应该拥有所有24个SgApp类型的对象(它们是在构造器中创建的)。
我提到这个信号11只发生过一次,我得到的只是一个糟糕的核心转储。在正常情况下,这是不可重复的,所以我正在寻找每一个可能的解释,包括可能是一些硬件故障或一些异国情调。
难道你不能显示实际的C++代码吗? – 2013-02-18 12:20:55
@JoachimPileborg不幸的是我基本上在PSM构造函数中有'keys = new SgApp [24];'而在PSM析构函数中我有'delete [] keys;'。也没有PSM对象作为值传递。 – George 2013-02-18 12:31:02
这可能是因为你删除了一个实际上不存在的对象,所以'this'在析构函数中很可能是空的或另一个无效的指针。 – 2013-02-18 12:34:35