最近、このミスをやってしまったので覚書にしておく。
要するに、コンテナに値を追加・削除するとイテレーターが無効になる、と同じことなのだが、参照だとついついやってしまいます。
ちなみに、このバグはコンテナの領域が再配置されない限り発生しないので、reserveメソッドを使用して適当な領域を確保するとデバッグが困難になるので、マジで注意が必要です。
以下、バグの再現コードです。
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
vector<int> array1;
array1.reserve(10);
for ( int i = 0; i < array1.capacity(); i++ ) {
array1.push_back(i);
}
int &last_value = array1.back(); // コンテナの要素の参照を得る
cout << "last_value: " << last_value << endl;
array1.push_back(10); // ここでlast_valueは無効になる
cout << "last_value: " << last_value << endl;
return 0;
}
実行結果
VC++ .NET 2003 / WINDOWS XP Professional 64 bit edition(32ビット環境で作成・実行)
last_value: 9
last_value: -572662307