Seaside Laboratory

Post

vector を fill_n してクラッシュ

「ポインタ配列を作成して NULL で初期化」というありふれたコードを書いた。

int size = 100;
// ポインタ配列
std::vector< HOGE* > lphoges;
// 予め確保
lphoges.reserve( size );
// NULL で初期化
std::fill_n( lphoges.begin(), size, static_cast< HOGE* >(NULL) );

プログラムを実行すると fill_n のところでクラッシュして停止してしまう。原因がわからず暫く悩んでしまったが、reserve の挙動を勘違いしていただけだった。

void reserve(size_type n)
領域を拡張することなしに少なくとも n 個の要素を格納できるよう、領域を確保します。

reserve は capacity を増やすものであって、size を増やすものではない。Effective STL でも触れられていたのにすっかり忘れていた。