0

私のプログラムは動作しますが、私の教授は私のコードが間違っていると言っていますが、秋学期にその理由を明らかにすると述べています...彼は何について話しているのですか? おそらく何かが不適切ですか?あなたが間違っていたとしても、あなたの頭脳を選んでいただければ幸いです:)

void CResizableArray::SetSize( int intNewSize )
{
    int intIndex = 0;

    if( intNewSize < 0 ) intNewSize = 0;
    if( intNewSize > intMAXIMUM_ARRAY_SIZE )
    {
        intNewSize = intMAXIMUM_ARRAY_SIZE;
    }

    //////////////////////////////////////
    //     ---> HUGE BUG HERE <---      //
    //     Code works but is WRONG      //
    // WHY IS THIS HELP ME FIND THE BUG //
    //////////////////////////////////////

    m_intArraySize = intNewSize;
    m_paintValues = new int [m_intArraySize];

    // Initialize to zero
    for( intIndex = 0; intIndex < m_intArraySize; intIndex++ )
    {
        *( m_paintValues + intIndex ) = 0;
    }
}
4

2 に答える 2

8

おそらくこの行の前に

m_paintValues = new int [m_intArraySize];

m_paintValues別の配列を指していました。その配列は現在リークされています - あなたはそれへのポインタを持っていないので、決して解放することはできません. したがって、そのメモリは再利用できません。これを大量に行うプログラムを作成すると、非常に長く実行する前にメモリが不足します。

メモリのブロックを使い終わったら、それを解放する必要があります。ここで、適切なことは次のようになります

delete[] m_paintValues;
m_paintValues = new int [m_intArraySize];

ただし、さらに問題があります。まず第一に、それが確実に配列を指してdelete[]いることがわかっていない限り、使用することはできません。m_paintValuesコンストラクターでそれを確認できます。さらに問題なのは、新しいサイズを設定すると、以前のデータが破棄されるという事実ですm_paintValues。古い値を新しい配列にコピーしたくないですか? そうすることは、最初に割り当てられたときに一時変数を使用して新しい配列を保持し、データをコピーしてから、新しい配列をメンバー変数に割り当てることを意味します。

于 2012-06-13T03:39:31.653 に答える
2

彼は、サイズ変更であるため、配列の古いコンテンツを保持して新しい配列に転送する必要があることを意味している可能性があります。スニペットでは、古いコンテンツを破棄して新しい空の配列を作成するだけです。

だから代わりに

m_paintValues = new int [m_intArraySize];
// Initialize to zero
for( intIndex = 0; intIndex < m_intArraySize; intIndex++ )
{
    *( m_paintValues + intIndex ) = 0;
}

行う

int* newBiggerArray = new int[m_intArraySize];
for (intIndex = 0; intIndex < m_intArraySize; ++intSize)
{
   if ( intIndex < oldMaxSize )
   {
     newBiggerArray[intIndex] = m_paintValues[intIndex];
   }
   else
   {
     newBiggerArray[intIndex] = 0;
   }
}
delete [] m_paintValues;
m_paintValues = newBiggerArray;

あなたが理解できるように、以前よりも小さい値へのサイズ変更を処理する部分を残します。

于 2012-06-13T03:41:58.307 に答える