Исключение bad_alloc при попытке печати значений
Я отлаживал свою другую проблему назад, к MyMesh
конструктор. В этом коде:
if (hollow) {
numTriangles = n*8;
triangles=new MyTriangle[numTriangles];
if (smooth) numSurfacePoints=n*8;
else numSurfacePoints=n*12;
surfacePoints=new SurfacePoint[numSurfacePoints];
}else {
numTriangles = n*4;
triangles=new MyTriangle[numTriangles];
if (smooth){
numSurfacePoints=n*4;
surfacePoints=new SurfacePoint[numSurfacePoints];
surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
}else{
numSurfacePoints=n*6;
surfacePoints=new SurfacePoint[numSurfacePoints];
surfacePoints[n*6]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
surfacePoints[n*6+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
}
}
Я определяю необходимые SurfacePoints и Triangles для меша. В bools "hollow" и "smooth" указывается, нужно ли мне отверстие в конусе, или если нормали совпадают, но я думаю, что это не имеет значения.
Проблема в том, что: если hollow==false, он что-то делает не так, но не вылетает, он даже позволяет поместить значения в массивы, но когда я пытаюсь сделать это следующим образом:
for(int i=0;i<numSurfacePoints;i++){
std::cout<<"vertex "<<i<<"-> pos:"<<surfacePoints[i].pos.x<<" "<<
surfacePoints[i].pos.y<<" "<<surfacePoints[i].pos.z<<
" norm:"<<surfacePoints[i].norm.x<<" "<<surfacePoints[i].norm.y<<
" "<<surfacePoints[i].norm.z<<"\n";
}
он выдает исключение bad_alloc, когда i=0.
кроме того, было время, когда верхний сегмент кода бросал bad_alloc в оператор new, но эта проблема просто решалась сама собой, но, возможно, она актуальна.
Кто-нибудь может мне помочь?
4 ответа
Тогда вы выделяете память для N точек поверхности, так как же вы можете назначить значение для N-й и N+1-й точек?
Пожалуйста, поставьте галочку для условий вне массива...
Вы пишете за пределами выделенной памяти.
С
numSurfacePoints=n*4;
surfacePoints=new SurfacePoint[numSurfacePoints];
допустимый диапазон индекса, который вы можете использовать, равен [0 ... (n*4 - 1)] (например, для n=10 вы можете использовать индекс [0..39])
но потом пишешь
surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
которые оба выходят за пределы этого (то же самое происходит с гладким регистром), т.е. для n==10 вы пишете в индексы 40 и 41.
Таким образом, вы портите кучу (память - это то, откуда приходят "новые"). В зависимости от макета памяти (который может варьироваться от одного прогона к следующему) вы перезаписываете данные, которые принадлежат кому-то другому (или куче, или другой части вашей программы). В зависимости от компоновки он может сразу потерпеть крах или заложить семена для более позднего сбоя или проблемы.
В вашем случае, когда вы делаете вывод, библиотека времени выполнения также выделяет (вызывает malloc или new), чтобы получить некоторую память для своих действий, и система кучи замечает, что что-то не так (вы перезаписали некоторые данные, которые нужны системе кучи). управлять кусками памяти) и выдает исключение.
Сколько n
? Вот где количество SurfacePoints рассчитывается по...
Похоже, ваша куча повреждена. Убедитесь, что вы не удаляете выделенные указатели более одного раза. Недоступен за пределами элементов массива. Не доступ к удаленным указателям и т. Д.