我正在写一个基本的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。
答案 0 :(得分:3)
在for循环中,您无论何时都在迭代Count
。但是你的新数组只能容纳Count - 1
个元素。这会导致堆损坏。