исключение bad_alloc при попытке печати значений - PullRequest
0 голосов
/ 19 ноября 2009

Я отладил мою другую проблему назад, в конструктор 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));
    }
}

Я определяю необходимые точки поверхности и треугольники для сетки. В 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 ]

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

Вы выделяете память для N точек поверхности так как вы можете присвоить значение N-й и N + 1-й точке?

Пожалуйста, поставьте галочку для условий вне массива ...

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

Вы пишете вне выделенной памяти.

С

    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), чтобы получить некоторую память для своих действий, и система кучи замечает, что что-то не так (вы перезаписали некоторые данные, которые куча система должна управлять частями памяти) и выдает исключение.

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

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

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

Сколько стоит n? Вот где количество SurfacePoints рассчитывается по ...

...