SIGFPE beim Zugriff auf unordered_map

8

Ich habe unordered_map<Block, int> , wobei Block eine einfache Struktur ist, die wie folgt definiert ist:

%Vor%

Beim Versuch, auf die Map zuzugreifen, erhalte ich die folgende Fehlermeldung in gdb (das gilt sowohl für g ++ 4.7.1 als auch für clang ++ 3.1):

%Vor%

Meine libstdc ++ Version ist 3.4.17 (d. h. die Version von GCC 4.7)

Relevantes Backtrace:

%Vor%

Edit: Ich dachte nicht, dass es tatsächlich einen Unterschied machen würde wo Ich rufe die Funktion auf, solange ich dieselben Argumente gebe, aber anscheinend tut es das:

%Vor%

führt zu dem Fehler, obwohl nur:

%Vor%

funktioniert einwandfrei ( blocks ist eine einfache vector<Block>& )

    
Voo 27.11.2012, 09:16
quelle

3 Antworten

5

Nebenbei: Wenn Ihre Hash-Funktion nicht werfen kann, ist es sehr wichtig, ihr eine noexcept -Ausschlussspezifikation zu geben, andernfalls muss die Hash-Tabelle den Hash-Code jedes Elements neben dem Element selbst speichern (was die Speicherauslastung erhöht) wirkt sich auf die Leistung aus, sodass Containeroperationen, die nicht ausgelöst werden müssen, den Hashcode nicht neu berechnen müssen.

Der SIGFPE impliziert eine Division durch Null und vom Backtrace kommt es hier vor:

%Vor%

was wahrscheinlich bedeutet, dass __den gleich Null ist. Dieser Wert stammt aus der Bucket-Anzahl der Hash-Map, die nicht Null sein sollte.

Können Sie bestätigen, dass bei einem Absturz m._M_bucket_count gleich null ist?

Wenn ja, deutet das entweder darauf hin, dass du die Karte irgendwie korrumpiert hast (hast du versucht mit -D_GLIBCXX_DEBUG zu kompilieren, um die libstdc ++ Debug-Modus-Prüfungen zu aktivieren? Hast du versucht, unter valgrind zu laufen?) oder es gibt einen Fehler in der libstdc ++ code.

    
Jonathan Wakely 10.01.2013 17:42
quelle
4

Ich hatte genau das gleiche Problem. Es wurde verursacht, indem Memset versehentlich auf Containerdaten angewendet wurde.

    
Vitalik Verhovodov 19.10.2014 06:31
quelle
2

In meinem Fall trat das selbe Problem wegen statischem init fiasco auf. Von einer Objektdatei habe ich emplace-Methode für statische std :: unordered_map aufgerufen, die in der zweiten Objektdatei definiert wurde. Da zu Beginn Daten bei BSS waren, war der Wert der Bucket-Zählung Null = & gt; SIGFPE.

    
user1641854 04.04.2016 15:27
quelle

Tags und Links