0

動的コレクション 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 から長さ + 1 の間で指定されているかどうかを確認しています (コレクションの ond にアイテムを追加するオプションが必要なため)。次に、割り当てられた配列の終わりではないかどうかをテストしています(GetLength()=配列内の要素数を取得し、長さ=要素に割り当てられたスペースの数)。そうであれば、配列に新しいスペースを割り当て、実際の要素をコピーし、古いストレージを解放し、ポインタを新しいアドレスに設定しています。

その後、新しいスペースを再度割り当てています。実際の要素をゼロからインデックス - 1 にコピーし、その位置に挿入する必要がある項目を設定し、他の古い要素をインデックス (以前のインデックス + 1) にコピーします。最後に、古いスペースを解放して新しいスペースを追加しています。

エラー:デバッグを開始しました。すべて正常でした。最初に Insert を問題なく実行しましたが、最初の削除 ( delete[] this->items;if ブロック内) で次のエラーを受け取りました。 なんで?

なぜ私がこれを取得しているのか、どうすれば修復できるのか誰か知っていますか? 配列範囲をどこにも行っていないと思います。助けてください。

4

1 に答える 1

1

あなたの問題はこの行です:

T * store = new T[length];

アイテムを挿入しますが、以前よりも大きな配列を割り当てないでください。CopyTo新しい配列に移動すると、配列がオーバーフローします。

于 2012-10-14T07:13:29.010 に答える