古い学校の配列を変更しているときにこの問題が発生しました。しかし興味深い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.)では、パラメータと渡された変数のシグネチャが正確に一致するため、削除によって実際にローカル変数が保持するメモリが削除されますか?
ここにはどのようなポインタがありますか?
なぜあなたは 'delete'を呼び出していますか? 'new' /' new [] 'を呼び出さない限り' delete'/'delete []'を呼び出さない – NathanOliver
メモリは 'new'からのものではないので、どちらの場合も未定義です。それ以上の理由はありません。 – aschepler
私はここで下降声明を理解していません - @GameOfChessは、動作を定義するために 'delete'のために' new'で割り当てる必要があることを明らかに忘れてしまった(または知らなかった)。それどころか、この問題は、この問題にぶつかる未来のGoogleにとっては非常に有用なものになると思います。 – Cullub