2016-11-16 10 views
-5

古い学校の配列を変更しているときにこの問題が発生しました。しかし興味深い1:ポインタと配列の異なるdeleteの振る舞い

a[] = {1,2,3,4,5}; 
a[][] = {{1,2,3,4}, {4,5,6,7}, {8,9,10,11}, {12,13,14,15}} 

が2つのシナリオを考えてみましょう:

1)

void func(int *a) { //passing a 1D array 
    a[1] = 100; //modified an element here 
    delete a; //This would have no effect on the array outside this function. 
} 

2)

void func(int (*a)[4]) { //passing a 2D array 
    a[1][2] = 100; //modified an element here of 2D array 
    delete a; //Would have an effect on the outside. Would delete a[0][0]'s memory outside. 
} 

質問はなぜですか? 1.)ポインタは配列変数メモリを指しますので、削除署名はメモリa [0]をクリアしませんか?

2.)では、パラメータと渡された変数のシグネチャが正確に一致するため、削除によって実際にローカル変数が保持するメモリが削除されますか?

ここにはどのようなポインタがありますか?

+11

なぜあなたは 'delete'を呼び出していますか? 'new' /' new [] 'を呼び出さない限り' delete'/'delete []'を呼び出さない – NathanOliver

+14

メモリは 'new'からのものではないので、どちらの場合も未定義です。それ以上の理由はありません。 – aschepler

+0

私はここで下降声明を理解していません - @GameOfChessは、動作を定義するために 'delete'のために' new'で割り当てる必要があることを明らかに忘れてしまった(または知らなかった)。それどころか、この問題は、この問題にぶつかる未来のGoogleにとっては非常に有用なものになると思います。 – Cullub

答えて

0

複数のレベルで未定義の動作が呼び出されています。 delete[]ではなく配列のdeleteを呼び出し、newで割り当てられていないオブジェクト上の任意のフォームdeleteを呼び出します。

あなたのプログラムは、必要なものは何でもできます。

+0

はい。私はそれについて何か不思議に思っていたし、何が2つのシナリオの下でなぜ異なっていたのか理解しようとしていました。 – GameOfChess

関連する問題