2013-02-09 56 views
-1

我在寫一個基本的List類。它由一個數組支持,而不是一個向量,因爲我們不允許使用向量。刪除,自定義列表上的C++堆損壞

當我在內部支持陣列上調用delete[]時,我似乎遇到了堆損壞問題。

template <typename T> 
void List<T>::Remove(int elementIndex) 
{ 
    // Here, I'm creating a new array of one less size to copy all elements over 
    T* newArray = new T[Count - 1]; 
    bool skippedElement = false; 

    for (int i = 0; i < Count; i++) 
    { 
     if (i == elementIndex) 
       skippedElement = true; 

     newArray[i] = array[ skippedElement ? i + 1 : i ]; 
    } 

    delete[] array; // Heap corruption! See below for definition of array 
    array = newArray; 

    Count--; 
    Capacity--; 
} 

List.h

class List 
{ 
    ... 
    private: 
    T* array; 
    ... 

    template <typename T> 
    List<T>::List(void) 
    { 
     array = new T[1]; 
    } 

    template <typename T> 
    List<T>::~List(void) 
    { 
     delete[] array; 
    } 
} 

有誰知道這是爲什麼出現?

this useful post,它說:

大多數堆損壞是由(A)調用刪除次數太多(B)調用了錯誤的形式刪除,或(C)訪問引起了堆分配array out of bounds。

我只是不確定A,B或/和C是否爲真。我是否在刪除後調用刪除?我不這麼認爲。我也認爲我正在調用正確的刪除形式:刪除括號。我當然希望不是C.

+0

什麼是數組?它沒有在任何地方定義。 – Mic 2013-02-09 07:17:53

+0

對不起,在接下來的幾分鐘裏要大量編輯,只是想先提出問題。 – Jason 2013-02-09 07:18:26

+5

考慮一下你在'i == Count-1'時分配的索引,然後你跳過了一些東西。 – Mat 2013-02-09 07:19:10

回答

3

在for for循環中,您正在迭代Count。但是你的新陣列只能容納Count - 1個元素。這導致堆腐敗。

+0

似乎這樣做。謝謝。 – Jason 2013-02-09 07:28:08

+0

高興地幫助:) – 2013-02-09 07:29:08

+0

@Jason如果它的作品,然後給它一個綠色的刻度.... – 2013-02-09 07:29:11