Was bedeutet der folgende Laufzeitfehler: "terminate called ohne eine aktive Ausnahme \ n Aborted"

8

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 *

    
xunzhang 12.11.2011, 14:23
quelle

5 Antworten

18

Wenn ich diesen Fehler gesehen habe, wurde dies durch das Zerstören des Thread-Objekts verursacht, bevor der gekapselte Thread beendet wurde.

    
Gearoid Murphy 19.09.2012 16:25
quelle
7

Ich stieß auf dieses Problem, als ich versuchte zu werfen; außerhalb einer Fangklausel. Der erneute Durchlauf schlägt fehl und diese Fehlermeldung wird angezeigt.

    
adsf 09.04.2012 20:19
quelle
4

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:

  • Multithread-Programme, die ohne die richtigen Flags kompiliert wurden
  • Ein Destruktor, der als Teil des Stack-Unwinding-Prozesses aufgerufen wurde, hat eine Ausnahme ausgelöst

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.

    
thiton 12.11.2011 15:05
quelle
2

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%     
Akseli Palén 25.03.2013 09:57
quelle
1

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.

  
    
Riot 21.03.2013 19:48
quelle

Tags und Links