创建动态集合错误

时间:2012-10-14 06:57:54

标签: c++ arrays pointers heap

我有这个用于管理动态集合List的代码,它主要受.NET System.List集合的启发,但这是用普通的C ++编写的。

void List<T>::Insert(int index, T item)
{
    if(index > GetLength() && index >= 0)
        throw new StandartException("Index was out of array range");

    if(GetLength()==length)
    {
        T * newl = new T[length + 4];
        this->CopyTo(newl);
        delete[] this->items;
        this->items = newl;
        length += 4;
    }

    T * store = new T[length];
    CopyTo(store, index);
    store[index] = item;
    CopyTo((store + index + 1), index, GetLength() - index);
    used++;
    delete[] items;
    items = store;
}

template <typename T>
void List<T>::CopyTo(T * destination, int start, int count)
{
    for(int i = start, c = 0;i < GetLength() && c < count;i++, c++)
        *(destination + i) = items[i];
}

所以有方法Insert,它必须在数组中的指定索引上插入项。 首先,我正在检查是否在0和Length + 1之间指定索引(因为我需要在集合的ond上添加项目)。然后我测试它是否不是已分配数组的结尾(GetLength()=获取数组中元素的数量,length =元素的已分配空间数)。如果是,我正在为数组分配新空间,复制实际元素,释放旧存储并将指针设置为新地址。

之后我再次分配新空间。我正在将实际元素从零复制到索引 - 1,设置项必须插入其位置并将其他旧元素复制到其索引(它们的先前索引+ 1)。最后,我释放旧空间并添加新空间。

错误:我开始调试了。一切正常,我首先运行Insert而没有问题,但是在第一次删除时(delete[] this->items;在if块中)我收到了这个错误: Why?

有人知道我为什么会这样做,我该如何修理它?我认为我没有在任何地方都进过阵列范围。 请帮忙。

1 个答案:

答案 0 :(得分:1)

你的问题就在这一行:

T * store = new T[length];

您插入一个项目,但不要分配比以前更大的数组。当您转到CopyTo新阵列时,会溢出阵列。