-1

私は基本的な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;
    }
}

なぜこれが起こっているのか誰かが知っていますか?

この有用な投稿によると、それは言う:

ほとんどのヒープ破損は、(A)deleteを何度も呼び出すか、(B)間違った形式のdeleteを呼び出すか、(C)ヒープに割り当てられた配列に範囲外でアクセスすることによって発生します。

A、B、または/およびCが真であるかどうかはわかりません。すでに削除された後に削除を呼び出していますか?私はそうは思わない。また、私は正しい形式の削除と呼んでいると思います。括弧を付けて削除します。そして、私は確かにCではないことを望みます。

4

1 に答える 1

3

あなたの for ループではCount、何回も繰り返していません。Count - 1ただし、新しい配列は要素の数しか保持できません。これにより、ヒープが破損します。

于 2013-02-09T07:22:55.800 に答える