2013-02-09 57 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