2016-08-28 11 views
3

生のポインタによって作成されたCスタイルの配列についてのアイデアを得るための短いコードを書いています。今日このメソッドを使用するのは珍しいことですが、試してみたいと思います。だからここに私のコードです:C-Style-Arrayからメモリを解放してください。

#include <iostream> 

int main() { 
    int *ptr = new int[5]; 
    for(unsigned int counter = 0; counter < 5; counter++) { 
     ptr[counter] = counter * counter; 
     std::cout << ptr[counter] << std::endl; 
    } 

    delete [] ptr; 

    std::cout << ptr[2] << std::endl; // Contains still a value 
} 

出力:

0 
1 
4 
9 
16 
4 

その非常に単純なコード、私はちょうど5「INT」の文字のメモリフィールドを作成し、いくつかの数字でこれらを埋めてきました。私は、メモリリークを避けるために使用後に配列ポインタの構造体を削除しますが、私の驚きには、第1と第2のポインタが正しく削除されています。誰もがこの現象の答えを持っていますか?

+2

[はい、それは*未定義の動作*と呼ばれます](http://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviours-that-ac-programmer-should-know -a) – Rakete1111

+2

別のプロセスがそれらに書き込むまで、それらの値は保持されます。 'delete'の後にそれらを読み出すことは*未定義の動作*であり、その値はまだ有効です。 –

+0

コードにバグがあります。バグを修正すれば、謎が解消されます。はい、バグのコードは、あなたが期待することをしません。だから、バグを発見したときにバグを修正するのです。 –

答えて

4

ステートメントdelete [] ptrが完了すると、ptrのほとんどの使用(何かを指すように再割り当てする以外)は、未定義の動作を示します。

C++標準の "未定義"の意味は、標準で何が起こるかの制約や要件が指定されていないということです。したがって、1つの実装(コンパイラとライブラリ)では、結果を表示することがあります。別のプログラムでは、プログラムを異常終了させることができます。さらに別の実施形態では、プログラムが実行されるたびに観察される挙動が異なる可能性がある。これらのすべての可能性、および他のものは、規格が要件を記述していないため、正しいものです。

具体的には、実装によって提供されたoperator delete []の動作がメモリを上書きせず、プログラムがそのメモリに後でアクセスできないことを意味します。しかし、一連の他の操作(たとえば、別の配列の割り当てなど)が突然表示される結果を変更する可能性がある(またはそうでない)ことがあります。

関連する問題