Исключение 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 рассчитывается по...

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

Другие вопросы по тегам