2013-02-18 40 views
0

我有以下循環(這發生在類型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默認虛擬析構函數。

  1. 從這個代碼據我所知,一個對象指向一個虛函數表和從V表指向析構函數的第一個DWORD的第一個DWORD。它是否正確?每次我有虛擬析構函數時都會發生這種情況?

  2. 在什麼情況下,這個析構函數的調用會導致信號11 seg fault在這個確切的線0x086f5371 <+61>: call DWORD PTR [eax]?我的猜測是%eax指向的值在某個未分配區域,但是可能的原因是什麼?此時我應該擁有所有24個SgApp類型的對象(它們是在構造器中創建的)。

我提到這個信號11只發生過一次,我得到的只是一個糟糕的核心轉儲。在正常情況下,這是不可重複的,所以我正在尋找每一個可能的解釋,包括可能是一些硬件故障或一些異國情調。

+1

難道你不能顯示實際的C++代碼嗎? – 2013-02-18 12:20:55

+0

@JoachimPileborg不幸的是我基本上在PSM構造函數中有'keys = new SgApp [24];'而在PSM析構函數中我有'delete [] keys;'。也沒有PSM對象作爲值傳遞。 – George 2013-02-18 12:31:02

+0

這可能是因爲你刪除了一個實際上不存在的對象,所以'this'在析構函數中很可能是空的或另一個無效的指針。 – 2013-02-18 12:34:35

回答

2

我會推測你沒有遵循rule of three,你最終會得到兩個或多個指向同一個動態分配數組的對象。當他們的析構函數被調用時,第二次調用將導致嘗試delete [],這已經是delete[]版本。

+0

事實上,複製構造函數和賦值運算符沒有實現(這不是我的設計,在代碼中,所有參數都不是通過值傳遞的,而僅僅是指針),但這不是原因。如果在前4個字節之前被刪除的'keys'不能代表24而是使用gcc編譯器-1。編輯:我有一個核心轉儲,我可以打印一些值,包括數組的前4個字節。 – George 2013-02-18 12:48:38

相關問題