こないだ先輩に「C++のプログラムが落ちるんだけどちょっと見て」とか言われたから
適当にデバッグしようとしたものの、例外の内容がbad_alloc。
このPC32GBもメモリ詰んでるんだし、あ~どうせ無限ループでもして無駄にメモリ喰ってるんだろう、はいはい。
・・・とか思ってた時期が僕にもありました。
アルゴリズム自体がかなり複雑だったためよくわからない部分もあったものの、要は
std::vectorのpush_backで再確保が生じるときに落ちるらしい。
要求サイズは最大時で16GB...それ以下でも落ちるときは落ちる。
そんな馬鹿なと思ってとりあえず単純にアルゴリズムの必要計算領域を見積もってみたらあながちおかしなことでもなかった。
128MBくらいの画像データ2枚から物体の3次元形状を復元する過程において必要な「対応点抽出」(つまりどことどこの点が同一か?ということ)
のアルゴリズムが、画像データの128倍くらいメモリがいるらしく、それって16GBだよね…と。vectorの性質上その2倍まではメモリが必要になることがあったらしい。
最初にreserveして超巨大なvectorを作るよう1行足したら、とりあえずは動くようになりましたけど、まさかほんとにメモリが足りないだけだったとは思わなかった。
画像大きくするときどうしよう…
bad allocで悩んだのとか初めてでしたw