2017-12-06 4 views
1

Ich habe mehrere Beiträge über diesen Fehler gesehen, jedoch konnte ich keine Lösung finden. In meinem Code habe ich einen Vektor von "Gene" und jedes Gen enthält eine Quelle und ein Ziel in der Form eines int.C++ Laufzeitfehler: free(): ungültige nächste Größe (fast)

Ich möchte einen Vektor von Ints erstellen, der alle verschiedenen möglichen Werte der Quelle und des Ziels im Vektor der Gene enthält. Ich beginne damit, jedes Gen durchzugehen und die Quelle und das Ziel zu identifizieren und dann zu prüfen, ob diese ID bereits in dem Vektor existiert. Wenn dies der Fall ist, dann ignoriere es, aber falls es ein neuer Wert ist, füge es dem Vektor hinzu.

void addMutations(vector<Gene*>* genome){ 
    vector<int> nodeIDs; 

    for(int i = 0; i < genome->size(); i++){ 
     int src = genome->at(i)->sourceNeuronID; 
     int dst = genome->at(i)->destinationNeuronID; 

     if(find(nodeIDs.begin(), nodeIDs.end(), src) == nodeIDs.end()){ 
      nodeIDs.push_back(src);// <-- Issue is here 
     } 

     if(find(nodeIDs.begin(), nodeIDs.end(), dst) == nodeIDs.end()){ 
      nodeIDs.push_back(dst);// <-- Probably here too 
     } 
} 

Hat das Problem aus der Tatsache, dass src und dst am Ende der Iteration der for Schleife außerhalb des Gültigkeitsbereiches gehen?

+0

"Das Problem" wäre ... was? Die Fehlermeldung im Titel? Ich sehe nicht, wie ein "push_back" in einen Vektor von ints diesen Fehler geben könnte (da es kein 'free()' in irgendeiner Weise gibt). – DevSolar

+2

Dies geschieht normalerweise, wenn Sie außerhalb des reservierten Speichers schreiben. Mein Vorschlag ist, dass Sie aufhören, Zeiger so zu verwenden. Übergeben Sie einen Zeiger an den Vektor, übergeben Sie eine Referenz. Und anstatt einen Vektor von Zeigern zu haben, sollte man einen Vektor von Instanzen haben (es sei denn, man benötigt Zeiger für Polymorphie, die man nicht zu benutzen scheint). Anstelle eines Vektors für die Knoten-IDs könnten Sie auch ein ['std :: unordered_set'] (http://en.cppreference.com/w/cpp/container/unordered_set) verwenden. –

+0

Sie müssen ein [MCVE] –

Antwort

1

Does the issue come from the fact that src and dst go out of scope at the end of iteration of the for loop?

Nein, diese Werte werden in den Vektor geschoben, bevor sie den Gültigkeitsbereich verlassen, also ist das in Ordnung.

C++ Runtime Error: free(): invalid next size (fast)

Dies bedeutet, dass Heap beschädigt ist. Valgrind kann in diesen Fällen hilfreich sein.

Dieser Speicherfehler stammt nicht von std::vector, sondern von Ihren Zeigern. Irgendwo, Sie befreien etwas, das Sie nicht sollten? Dies kann durch eine schlechte Speicherzuweisung in Ihrem Namen verursacht werden (etwas wurde nicht so zugewiesen, wie Sie es wünschen). Wer weiß, mit dem Code, den Sie gepostet haben.

In jedem Fall, sollten Sie wirklich Valgrind verwenden, um diesen Fehler nach unten zu verfolgen.


PS: Müssen Sie wirklich so viele Zeiger verwenden? Ich meine in Ihren Funktionen, könnten Sie einfach Ihre Vektor als Referenz übergeben haben, wie folgt aus:

void addMutations(vector<Gene*>& genome) { 

und dann tun:

genome.at(i)->sourceNeuronID; 

und so weiter.

Zeiger sind großartig (z. B. in Polymorphie), aber Sie sollten sie mit Vorsicht verwenden und natürlich verwenden Sie sie bei Bedarf (Pan Metron Ariston).

+1

Danke für die Eingabe.Ich habe die Funktion so geändert, dass sie nun als Referenz durchgeht, weil sie mehr Sinn ergibt. Was wirklich interessant ist, ist, dass an diesem Punkt im Code nichts frei war und alle Gene-Objekte gut definiert sind. Ich werde Valgrind um Hilfe bitten. Vielen Dank! – MagnusCaligo

+1

Dann ging eine Zuweisung falsch @MagnusCaligo. Zum Beispiel haben Sie weniger als benötigt zugewiesen, oder haben den Speicher nicht richtig einem Zeiger zugewiesen ... Oder Sie haben einen baumelnden Zeiger, oder .... es ist eine lange Liste! ;) Vergiss nicht * meine * Antwort zu akzeptieren, wenn es geholfen hat. Viel Glück und Sie sind willkommen! – gsamaras

+1

Ich habe es herausgefunden. Ich habe nicht genug Platz mit malloc in meinem Code reserviert. Hoffentlich hat jemand anderes in der Zukunft das hilfreich gefunden. Ich kann Valgrind nur wärmstens empfehlen, da ich innerhalb der ersten 15 Minuten mein Problem gefunden habe. – MagnusCaligo

Verwandte Themen