Pregunta

El mensaje:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

Miré el GDB Backtrace y este es el método de nivel más bajo que implementé:

/*
 * get an array of vec3s, which will be used for rendering the image
 */
vec3 *MarchingCubes::getVertexNormalArray(){
    // Used the same array size technique as getVertexArray: we want indices to match     up
    vec3 *array = new vec3[this->meshPoints.getNumFaces() * 3]; //3 vertices per face

    int j=0;
    for (unsigned int i=0; i < (this->meshPoints.getNumFaces() * 3); i++) {
        realVec normal = this->meshPoints.getNormalForVertex(i);
 //     PCReal* iter = normal.begin();

        if (normal.size() >= 3) {
            array[j++] = vec3(normal[0], normal[1], normal[2]);
        }
        cout << i << " ";
    }

    return array;
}

La instrucción CoUT que ve arriba indica que termina después de más de 7000 iteraciones. La función anterior se llama solo una vez cerca del final de mi aplicación. Llamo una función muy similar antes de llamar a lo anterior, eso no causa problemas.

¿Fue útil?

Solución 2

Mi problema resultó ser ese this->meshPoints.getNormalForVertex(i) accede a una matriz (o vector, no recuerdo) cuya longitud es menor que this->meshPoints.getNumFaces() * 3. Entonces estaba accediendo fuera de los límites.

Otros consejos

(Mover/expandirse de los comentarios)

Dado que está asignando una nueva matriz cada vez sin desastrarla, tiene una fuga de memoria masiva, es decir, continúa pidiendo memoria al sistema sin devolverla. Finalmente, el espacio en el montón termina, y en la próxima asignación, todo lo que obtienes es un std::bad_alloc excepción.

La solución de "estilo C" sería recordar desantar dicha memoria cuando ya no la necesite (con delete[]), pero, esto es (1) propenso a errores (piense, por ejemplo, si tiene múltiples rutas de retorno dentro de una función) y (2) potencialmente excepcionistas (cada instrucción se convierte en una ruta de retorno potencial si tiene excepciones!). Por lo tanto, de esta manera debe evitarse.

La solución idiomática de C ++ es usar consejos inteligentes - Objetos pequeños que encapsulan el puntero y los desaconsejan la memoria asociada cuando se destruyen, o contenedores estándar, que hacen más o menos lo mismo, pero con la semántica de copia y algunas campanas y silbatos (incluido el almacenamiento del tamaño de la matriz dentro de ellos) .

Recibí este error tratando de asignar una matriz de longitud negativa:

double myArray = new Double [-9000];

Por si acaso ayuda a alguien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top