删除,自定义列表上的C++堆损坏
我在写一个基本的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.
在for for循环中,您正在迭代Count
。但是你的新阵列只能容纳Count - 1
个元素。这导致堆腐败。
似乎这样做。谢谢。 – Jason 2013-02-09 07:28:08
高兴地帮助:) – 2013-02-09 07:29:08
@Jason如果它的作品,然后给它一个绿色的刻度.... – 2013-02-09 07:29:11
什么是数组?它没有在任何地方定义。 – Mic 2013-02-09 07:17:53
对不起,在接下来的几分钟里要大量编辑,只是想先提出问题。 – Jason 2013-02-09 07:18:26
考虑一下你在'i == Count-1'时分配的索引,然后你跳过了一些东西。 – Mat 2013-02-09 07:19:10