Der Fehler hat mich an zwei Tagen gestört: Beim Ausführen des Codes habe ich einen Laufzeitfehler von "terminate called ohne eine aktive Ausnahme \ n Aborted", warum?
Ich versuche, den Code zu finden und die Zeile zu finden, kann den Code "xx = new int [num]" verlassen, die Nummer in meinem Testfall ist etwa 640000 (64MB Speicher zu neu). Wenn ich die Nummer viel kleiner als 10, ist es OK, aber mein Code bekommen diesmal eine falsche Antwort.
Ich versuche alle "try / catch" -Klausel zu löschen, habe aber immer noch diesen Fehler.
Auch ich // alle Funktionen, die die "xx = new int [num]" -Klausel aufrufen, ist der Fehler immer noch vorhanden, und dieses Mal, wenn ich den Code finde, kann exit eine normale "for-Schleife" sein.
Der ganze Fall hat den Compiler passiert, haben Sie jemals diesen Fehler bei der Ausführung Ihres Codes getroffen? Vielen Dank!
I // einige delete-Klausel und den Fehler unten erhalten: * glibc detected * ./ESMF_RegridWeightGen: munmap_chunk (): ungültiger Zeiger: 0x00000000005cd376 *
Wenn ich diesen Fehler gesehen habe, wurde dies durch das Zerstören des Thread-Objekts verursacht, bevor der gekapselte Thread beendet wurde.
Die Nachricht "ohne aktive Ausnahme beenden" ist ein Hinweis darauf, dass die Ausnahmebehandlung zu irgendeinem Zeitpunkt in Ihrem Programm unterbrochen wurde.
Die Speicherzuordnung ist wahrscheinlich die Hauptursache, aber wahrscheinlich nicht die Fehlerstelle. Die große Zuweisung wird eine std :: bad_alloc-Ausnahme auslösen, und diese Ausnahme wird irgendwo falsch behandelt.
Um die Theorie zu validieren, fügen Sie eine Zeile wie
ein %Vor%über der Zuweisung, sollte dies auch den Fehler auslösen.
Ich habe zwei häufige Ursachen dafür gefunden:
Sie sollten in der Lage sein, die letztere Bedingung mit einem Debugger zu diagnostizieren. Ein Stack-Trace Ihrer Anwendung (z. B. durch Ausführen in gdb) sollte sehr hilfreich sein.
Wie Gearoid Murphy sagte der Fehler passiert, wenn das Thread-Objekt zerstört wird, bevor die Thread-Funktion selbst vollständig ausgeführt wurde. Ich habe diesen Fehler mit der tinythread-Bibliothek ( Ссылка ) festgestellt:
Vorher:
%Vor%Nachher:
%Vor% Mit MinGW wird das Problem durch Hinzufügen der -mthreads
-Compileroption zu gcc gelöst.
Von dem gcc-Handbuch :
-Mthreads
Unterstützung thread-sicherer Ausnahmebehandlung auf Mingw32. Code, der auf thread-sicherer Ausnahmebehandlung beruht, muss den gesamten Code mit der Option -mthreads kompilieren und verknüpfen. Beim Kompilieren definiert -mthreads -D_MT; Beim Linken wird in einer speziellen Thread-Hilfsbibliothek -lmingwthrd verlinkt, die pro Thread-Ausnahmebehandlung Daten bereinigt.