実際、最近のオペレーティング システムでは、メモリ不足になることはほとんどありません。それを行う前に、マシンは頻繁にスワップし、多かれ少なかれ使用できなくなります。これを見逃すことはできません。また、数年前に Win2k で実験を行ったとき、テスト アプリが可能な限り多くのメモリを割り当てると、ほぼすべてのアプリケーションがクラッシュすることがわかりました。(これには、デバッガー、オフィス アプリケーション、ブラウザー、メール アプリ、さらにはメモ帳が含まれます。)
したがって、不当に大きな量を割り当てようとしているか、ヒープがひどく断片化されて、妥当な要求さえも処理できなくなっていると思います。
このようにコードを書くのはどうですか:
// for example
const std::size_t arbitrary_max_size_constant = std::vector<float>::max_size();
// or std::nummeric_traits<std::size_T>.max() / 10;
if (texture!=NULL){
assert(mesh->numSurfacePoints < arbitrary_max_size_constant);
texCoords = new float[mesh->numSurfacePoints*2];
// ...
}
これにより、プログラムにバグがある場合にデバッグ モードで警告が表示されますが、リリース コードが遅くなることはありません。別の可能性は、例外をキャッチして、プログラムが割り当てようとしていたメモリを出力することです。
if (texture!=NULL) {
try {
texCoords = new float[mesh->numSurfacePoints*2];
} catch(const std::bad_alloc& x) {
std::cerr << "failed to allocate << mesh->numSurfacePoints*2 << " bytes!\n";
throw;
}
// ...
}
このようにして、値が不当に大きいかどうかも確認できます。そうである場合は、バグがあります。そうでない場合は、メモリが不足しているか、ヒープが断片化しすぎて、プログラムが必要とする量をこの場所に割り当てることができません。