次のコードを検討してください
void foo( bool forwad )
{
vector<MyObject>::iterator it, end_it;
int dir;
it = some_global_vector.begin() + some_position;
if( forward )
{
dir = 1;
it += 1;
end_it = some_global_vector.end();
}
else
{
dir = -1;
it -= 1;
end_it = some_global_vector.begin()-1;
}
while( it != end_it )
{
if( do_domething() )
break;
it += dir;
}
}
ご覧のとおりforward == false
、からの減算がありbegin()
、イテレータit
がを指すと減算できるため、疑問が生じますbegin()
。この悪いポインティングイテレータを逆参照しない限り、問題がなければどこにも見つかりません)。
編集
ISO C ++標準を読み、いくつかの結論があります。vector::begin()
住所で内部的に記憶を指し示すことができないという約束はなく0
、それで終わりだと思っていましたが、すべてのコンテナは標準のアロケータに依存しています。このアロケーターはnew
オペレーターによって異なります。また、new
二度と戻らない情報はありません0
。ただし、標準のアロケータは演算子にも依存しdelete
、この演算子は、を渡しても何もしないと想定されています0
。したがって、この事実により、そのポインタを削除する方法がないため、new
返すことはできません。0
それによって、空でない場合は、そのポイントをvector
返すことができません。begin()
0
結論:
上記が正しい場合vector::begin()
、の内部メモリvector
は連続的であるため、ポイントするインタレータは安全である必要があります。
私は正しいですか?
究極の答え
現在動作しており、将来動作する場合でも、標準による未定義の動作です。これを行う場合は、自己責任で行ってください。詳細については、この同様の質問を参照してください。