проблемы с оператором new при размещении массивов - PullRequest
0 голосов
/ 18 ноября 2009

У меня проблемы с моей программой C ++ / openGL.

в некоторой точке кода, например, (это конструктор):

MyObject(MyMesh * m, MyTexture* t, float *c=NULL, float *sr=NULL, int sh=100){
texture=t;
mesh=m;
subObjects=NULL;
texCoords=NULL;
if (texture!=NULL){
        texCoords=new float[mesh->numSurfacePoints*2];

новый создает исключение std :: bad_alloc. то же самое в другом месте. Возможно ли, что у меня закончилась память? я так не думаю, так что если бы вы могли мне помочь, я был бы рад! До свидания!

Ответы [ 4 ]

2 голосов
/ 18 ноября 2009

Вам также следует проверить значение mesh->numSurfacePoints, возможно, это фиктивное или отрицательное значение, которое также может быть источником ошибки.

2 голосов
/ 18 ноября 2009

возможно ли, что мне не хватило памяти?

Сколько памяти использует ваша программа, когда выбрасывается std::bad_alloc?

Какое значение mesh->numSurfacePoints при сбое? Вы абсолютно уверены, что указатель, переданный как mesh, является действительным указателем? Если у вас очень фрагментированное адресное пространство, может быть недостаточно непрерывного пространства для выделения большого массива. Как долго работает ваша программа, прежде чем выдается std::bad_alloc?

Если вы еще этого не сделали, вам следует рассмотреть возможность использования boost::scoped_array или какой-либо другой формы интеллектуального указателя для массивов, чтобы удаление происходило автоматически, когда выделенные в куче объекты больше не нужны.

1 голос
/ 18 ноября 2009

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

Таким образом, вы также увидите, является ли значение неоправданно большим. Если это так, у вас есть ошибка, в противном случае у вас либо не хватает памяти, либо куча слишком фрагментирована, чтобы выделить количество, необходимое программе в этом месте.

0 голосов
/ 18 ноября 2009

Вы когда-нибудь вызывали delete [] на texCoords? Похоже, вам не хватает памяти.

...