コンテナの要素の参照は危険

C++/STLで、ついついやってしまうミスに、コンテナの要素への参照を保存するがある。
最近、このミスをやってしまったので覚書にしておく。
要するに、コンテナに値を追加・削除するとイテレーターが無効になる、と同じことなのだが、参照だとついついやってしまいます。

ちなみに、このバグはコンテナの領域が再配置されない限り発生しないので、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
2008-05-21 | コメント:0件

コメントをどうぞ


『不適切なコメントへの対応』を一読下さい。
現在コメントは承認制となっております。

Previous Page | Next Page