删除,自定义列表中的C ++堆损坏

时间:2013-02-09 07:16:16

标签: c++ memory-management

我正在写一个基本的List类。它由数组支持,而不是向量,因为我们不允许使用向量。

当我在内部支持阵列上调用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)访问堆分配的数组超出界限引起的。

我不确定A,B或/和C是否属实。我删除后会调用删除吗?我不这么认为。我也认为我正在调用正确的删除形式:用括号删除。我当然希望不是C。

1 个答案:

答案 0 :(得分:3)

在for循环中,您无论何时都在迭代Count。但是你的新数组只能容纳Count - 1个元素。这会导致堆损坏。