Frage

Die Nachricht:

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

Ich habe mir die GDB -Backtrace angesehen und dies ist die niedrigste Methode, die ich selbst implementiert habe:

/*
 * 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;
}

Die oben angezeigte Cout -Anweisung zeigt an, dass sie nach über 7000 Iterationen endet. Die obige Funktion wird nur einmal gegen Ende meiner Anwendung aufgerufen. Ich rufe eine sehr ähnliche Funktion auf, bevor ich das oben genannte aufzurufen. Dies verursacht keine Probleme.

War es hilfreich?

Lösung 2

Mein Problem stellte sich als das heraus this->meshPoints.getNormalForVertex(i) Zugriff auf ein Array (oder Vektor, ich kann mich nicht erinnern), dessen Länge geringer ist als this->meshPoints.getNumFaces() * 3. Es war also außerhalb der Grenzen.

Andere Tipps

(Bewegen/Erweitern von den Kommentaren)

Da Sie jedes Mal ein Neuarray zuweisen, ohne es zu behandeln, haben Sie ein massives Speicherleck. Schließlich ist der Raum auf dem Haufen und bei der nächsten Zuweisung nur ein std::bad_alloc Ausnahme.

Die Lösung im C-Stil wäre, sich daran zu erinnern, ein solches Gedächtnis zu bearbeiten, wenn Sie es nicht mehr brauchen (mit delete[]), aber dies ist (1) fehleranfälliger (denken Sie an, zB, wenn Sie mehrere Rückgaberwege in einer Funktion haben) und (2) potenziell ausnahmslos nicht sicher (jeder Befehl wird zu einem potenziellen Rücklaufpfad, wenn Sie Ausnahmen haben!). So sollte dieser Weg vermieden werden.

Die idiomatische C ++ - Lösung ist entweder zu verwenden Smart Zeiger - Kleine Objekte, die den Zeiger zusammenfassen und den zugehörigen Speicher begeben, wenn sie zerstört werden - oder Standardbehälter, die mehr oder weniger dasselbe tun, aber mit Kopiensemantik und mehreren Schnickschnack (einschließlich der Speicherung der Größe des Arrays) .

Ich habe diesen Fehler bekommen, um ein negatives Längenarray zuzuweisen:

double myarray = new Double [-9000];

Nur für den Fall, dass es jemandem hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top