はITER + someIntは過去エンド・イテレータは、 ITER + someInt == myVector.end()であるときに、ランダムアクセスイテレータ(例はstd ::ベクトルのmyVector)C++過去のエンドイテレータの場合、iterator +整数の結果は何ですか?
があると?
myVector.end()と異なる値にすることはできますか?
はITER + someIntは過去エンド・イテレータは、 ITER + someInt == myVector.end()であるときに、ランダムアクセスイテレータ(例はstd ::ベクトルのmyVector)C++過去のエンドイテレータの場合、iterator +整数の結果は何ですか?
があると?
myVector.end()と異なる値にすることはできますか?
これは未定義の動作です。何かが起こるかもしれません。オプションのいくつかに名前を付けるだけです。何もない、プログラムの終了、例外、クラッシュ。
結果はC++標準では定義されていません。
これは未定義の動作です。標準ではその結果について何も言及していません。
これは、C++標準(2003)に従って未定義の動作を呼び出します。
これは、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によってアクセスすることができるので、より大きいので。もちろん、コンテンツはゴミかもしれません)。
本当に興味があるのであれば、アセンブラコードを見てください。
ミシェル、あなたは想像以上ではありません!いくつかのオプションがあります:http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete/1553407#1553407 ':)' – sbi