-9
void show(int* x){
    printf("%d",x[3]);
}

int main(){
    int* ptr;

    ptr = new int[9]();
    delete [] ptr;    


    printf("%d %d\n", ptr[7], *(ptr+7));
    show(ptr);

return 0;
}
4

3 に答える 3

8

なぜうまくいかないと思いますか?9 つの整数を割り当ててから、それらを削除します。それはうまくいきます。

問題は、削除された整数にアクセスすることです。一度実行するとどうなるかは問題ではありません。未定義の行動領域にいることになります。古い値が表示されるか、クラッシュするか、ユニバースが収縮し始める可能性があります。

于 2012-12-05T06:53:01.033 に答える
4

削除された動的に割り当てられた配列の要素にアクセスすることにより、未定義の動作を呼び出しています。何かが起こる可能性があるため、ここでは「機能していない」ことはありません。ptrは の前と同じメモリ アドレスを指しており、deleteアクセスしようとしたときにその場所に何があるかは何もわかりません。

于 2012-12-05T06:53:23.483 に答える
2

ポインターは の後delete[]に無効化されませんが、ポイントされたヒープ メモリは解放されるため、信頼できなくなります。このタイプのコードは、通常、並列システムで頭痛の種になります。

これは、削除直後にポインターを null にすることで回避できます。

delete[] ptr;
ptr = 0;
于 2012-12-05T06:53:46.183 に答える