我有以下循環(這發生在類型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