因此,我正在處理有序列表類的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;
}
再次感謝您閱讀本文,任何和所有幫助表示讚賞。
是否'對GetLength()'使用'size'呢? –
另外,如果您使用'new []'分配,那麼您需要使用'delete []'。 –
如果它不明顯,'GetListPtr()'和'GetLength()'對於這個函數是如何工作是至關重要的,並且說你決定不*包含它們是不方便的。特別是考慮到Ninja先生尚未回答的問題。 – WhozCraig