0

それで、

私は理解できないエラーに遭遇しています(私の理解が間違っていない限り)。

私は次のコードを持っています:

    int doubleSize=size*2;
    int *newArr = new int[doubleSize];
    for(int i=0; i<size; i ++) {
        newArr[i]=jon[i];
    }
    size*=2;

    display(newArr);
    jon=newArr;
    display(jon);
    delete[] newArr;
    display(jon);

1回目と2回目の呼び出しの後、私は自分が望む/期待するものを正確に取得します。3番目の表示呼び出しでは、0と1のインデックスはメモリアドレスであり、インデックスの残りの値は前の2つの呼び出しと一致します。これを引き起こしている可能性がありますか?

また、別のフォローアップの質問がありますが、コードを使用すると、jon []を削除しても、「古い」jon []がメモリに残りませんか?

ありがとう!

4

3 に答える 3

3

未定義の動作があるため、何が起こる可能性もあります。

int *newArr = new int[size*2];
// now newArr is a pointer to a memory area
jon=newArr;
// now jon is a pointer to the same area, whatever jon pointed to before is leaked
delete[] newArr;
// now the memory area no longer exists
display(jon);
// using jon is now illegal, it has the address of a deleted memory area

おそらく正しい解決策は次のとおりです。

int *newArr = new int[doubleSize]; // allocate a new area
for( int i=0; i<size; ++i ) {       // fill it in
    newArr[i] = jon[i];
}
delete [] jon; // get rid of the old area we don't need anymore
jon = newArr;  // now jon is linked to our brand new data in a brand new area
于 2013-02-10T04:58:54.920 に答える
3

の場合delete[] newArr、アドレスでメモリの割り当てを解除しますnewArrjonも同じメモリを指しているので(設定したため)jon = newArr、メモリは他の値(おそらくdisplay関数内)で上書きされています。行う必要があるのは、コピー機能(など)を使用して、と同じ場所を指すだけでなく、memcpyで新しく割り当てられたブロックにデータをコピーすることです。jonjonnewArr

于 2013-02-10T05:00:06.683 に答える
1

最後のdisplay呼び出しは、削除したものjonと同じものを表示しようとしています。newArrしたがって、動作は未定義になります。

于 2013-02-10T04:59:54.633 に答える