2011-05-10 5 views

答えて

4

これは未定義の動作です。何かが起こるかもしれません。オプションのいくつかに名前を付けるだけです。何もない、プログラムの終了、例外、クラッシュ。

+1

ミシェル、あなたは想像以上ではありません!いくつかのオプションがあります:http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete/1553407#1553407 ':)' – sbi

1

結果はC++標準では定義されていません。

2

これは未定義の動作です。標準ではその結果について何も言及していません。

2

これは、C++標準(2003)に従って未定義の動作を呼び出します。

0

これは、C++標準の後で、これが未定義の動作(他の回答を参照)につながることは間違いありませんが、実際には何が起こるのでしょうか?

実際、これはまったく神秘的ではないことがよくありますが、使用されるコンパイラとそのバージョン、標準ライブラリとコンパイラのフラグとOSに依存します。 これは、絶対に依存してはならないことを意味します(たとえば、次のコンパイラのバージョンによって動作が変わる可能性があります)。あなたの質問のために

(あなたは以下に頼るべきではありません):

T* _begin_; // pointing to begin of array of vector 
T* _end_; // pointing to end(), note that array might be larger due to reserve() 
:現在のコンパイラ(gccの、MSVC、インテルC++コンパイラー)のstd ::ベクトルは通常持っている(少なくとも)二つの部材で

普通はの末尾にポインタがあります。何も起こりません。多くの場合、あなたは簡単にもそれを間接参照することができます(どちらかの配列は

_end_-_begin_ 

またはメモリは、プログラムのaferによってアクセスすることができるので、より大きいので。もちろん、コンテンツはゴミかもしれません)。

本当に興味があるのであれば、アセンブラコードを見てください。

関連する問題