2

だから私は次のクラスメソッドを持っています(おそらく要求があればさらに追加します):

編集 1: paObject が初期化される場所と、到達するまでの方法は次のとおりです。setCapacity(int c)

template <Object>
ArrayClass<Object>::ArrayClass()
{
    _size = 0; //default in case allocation fails
    paObject = new Object[ARRAY_CLASS_DEFAULT_SIZE];
    if (paObject == NULL)
        throw Exception();
    _size = ARRAY_CLASS_DEFAULT_SIZE;
}

私のクラス Vector が拡張する (または c++ にあるものは何でも) ことに注意することが重要な場合がありArrayClassますclass MyVector: virtual public ArrayClass<Object>{}

template <class Object>
MyVector<Object>::MyVector() : ArrayClass<Object>()
{
    _currSize = 0;
    _incFactor = 5;
}

ArrayClass コンストラクターの呼び出しを強制します。

    template <Object >    
    void MyVector<Object>::setCapacity(int c)
    {
        int len = _currSize;
        if (len > c) len = c;
        Object* paNew = new Object[c];
        if (paNew == NULL) throw Exception();
        for (int i = 0; i < len; i++)
            paNew[i] = paObject[i];
        if (paObject != NULL)
            delete[] paObject;
        paObject = paNew;
        _size = c;
        if (_currSize > len)
            _currSize = len;
    }

エラーが発生した場合、c の6値は であり、_currSize (クラスのプライベート int 変数) の値は です1。また、paObject は、エラーが発生するまでにサイズ 1 のオブジェクトの配列で初期化されたオブジェクト型 (テンプレートなど) のクラス ポインターであることに注意してください ( Object* paObject = new Object[1])。

エラーが発生する行に到達するまで、すべてが正常に実行されdelete[] paObject;ますExpression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

私は何が悪いのか真剣に理解していません。助けていただければ幸いです。

4

2 に答える 2

1

このエラーは、ヒープに問題がある場合に発生します。
何かのようなもの:

int *a = new char[1];
a[500] = 0;

その後、まったく関係のないオブジェクトで、deleteまたはでエラーが発生しnewます。

于 2012-09-28T19:46:14.590 に答える
0

paObject が宣言されている場所、または (再) 初期化されている場所を示していません。

...しかし、それはほぼ間違いなく問題です。

NULL に初期化していない場合は、ランダムなガベージが含まれている可能性があります。その場合、NULL と評価されず、悪いことが起こります。

同様に、明示的に NULL にリセットしないと、悪いことも起こります。

もちろん、paObject が (「new []」で割り当てられた) 配列であるかどうかもわかりません。

結論:

1) 使用する前に paObject が初期化されていること、および再使用する前に正しく初期化されていることを確認してください。

2)配列オブジェクトとして扱う場合は、配列オブジェクトとして初期化されていることを確認してください

3) 「オブジェクト」、「オブジェクト参照」(&Object または Object *)、オブジェクトの配列の違いにも注意する必要があります。特に、既存のオブジェクトへの参照を渡すとき、または (おそらく意図せずに) 新しいオブジェクトを作成するときを考慮する必要があります。

これらのリンクは役立つはずです:

================================================== ================

補遺:

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)配列を上書きしているため、エラーが発生しているようです。

Object* paObject = new Object[1]  // This is really easy to overwrite!

コードのどこに paObject を記述している (または paObject のエイリアスに記述している) かわかりませんが、それが問題であることはほぼ確実です 。

私見では...

于 2012-09-28T19:52:55.363 に答える