2013-10-26 78 views
0

因此,我正在處理有序列表類的Expand方法中發生堆損壞錯誤。當客戶端嘗試將新項插入()到列表中時,將調用expand方法,並且當前沒有剩餘空間。當我刪除線,程序運行良好,但我知道我有一個無法訪問的對象,每次擴展。但是,當我將刪除行放入時,程序會在運行時爆炸。刪除數組指針時發生堆損壞C++

此外,這隻發生在我的Expand()方法中。它不會在我的Contract()方法中執行此操作,每次從列表中刪除時會調用它,這會將列表元素的數量降低到當前可用總空間的1/4以下,從而將大小減半。我可以在這個方法中刪除舊列表而不會有任何問題。 (),SetListPtr()和GetLength()都是從一個ListClass對象繼承而來的,我以一個頭文件和目標代碼的形式接收了這個對象,所以我不確定它們是如何工作的。 ItemType是一個結構體,只包含一個整數字段,鍵。

我已經閱讀了很多關於這裏的問題,並沒有發現任何似乎對我的情況提供任何幫助。

void OrdListClass::Expand() 
{ 
    ItemType* newList = new ItemType[size * 2]; 
    ItemType* temp = GetListPtr(); 

    size = size * 2; 

    // Copy the current list to the new list. 
    for(int i = 0; i < GetLength(); i++) 
     newList[i] = temp[i]; 

    // Point to the new list. 
    SetListPtr(newList); 

    // Delete the old list 
    delete temp; <-- This line 

    // Reset the pointers 
    temp = nullptr; 
    newList = nullptr; 
} 


void OrdListClass::Contract() 
{ 
    ItemType* newList = new ItemType[size/2]; 
    ItemType* temp = GetListPtr(); 

    size = size/2; 

    // Copy the old list into the new one 
    for(int i = 0; i < GetLength(); i++) 
     newList[i] = temp[i]; 

    // Set the list pointer to point to the new list 
    SetListPtr(newList); 

    // Delete the old list 
    delete temp; 

    temp = nullptr; 
    newList = nullptr; 
} 

再次感謝您閱讀本文,任何和所有幫助表示讚賞。

+1

是否'對GetLength()'使用'size'呢? –

+1

另外,如果您使用'new []'分配,那麼您需要使用'delete []'。 –

+0

如果它不明顯,'GetListPtr()'和'GetLength()'對於這個函數是如何工作是至關重要的,並且說你決定不*包含它們是不方便的。特別是考慮到Ninja先生尚未回答的問題。 – WhozCraig

回答

0

我假設你的清單與分配:

ItemType* newList = new ItemType[size * 2]; 

如果是這樣的話,你需要做的:用new[]分配

delete[] temp; 

元素,需要與delete[]被刪除。

http://www.cplusplus.com/reference/new/operator%20delete[]/

+0

謝謝,我實際上都嘗試過這兩種方法,但都沒有在我的Expand()方法中工作,但都在我的Contract()方法中工作。 – acwatson421