На самом деле, в современных операционных системах маловероятно, что вам не хватило памяти. Прежде чем вы это сделаете, машина поменяется настолько сильно, что станет более или менее непригодной для использования - вы не можете пропустить это. Кроме того, когда я проводил эксперименты с 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;
}
// ...
}
Таким образом, вы также увидите, является ли значение неоправданно большим. Если это так, у вас есть ошибка, в противном случае у вас либо не хватает памяти, либо куча слишком фрагментирована, чтобы выделить количество, необходимое программе в этом месте.