std::map insert mit segmentation fault
-
Hallo,
ich habe ein kleines Problem mit einer Klasse, in der ich eine std::map verwende. Hier der Code:
Cpp file:
#include "sisegment.h" SISegment::SISegment() : segments() { } SegmentInformation SISegment::CreateSegment(SegmentType type, unsigned int size) { unsigned int id = 0; if(segments.size() != 0) { std::map<unsigned int, SegmentInformation>::iterator it = segments.end(); SegmentInformation SegInfos = (*it).second; id = SegInfos.segmentId + 1; } std::stringstream sstm; sstm << "segment." << id << ".db" << std::endl; SegmentInformation newSegInfos(id, type, sstm.str(), size); segments.insert(std::make_pair(id, newSegInfos)); return newSegInfos; }
Header
#ifndef SISEGMENT_H #define SISEGMENT_H #include "segmentmanager.h" #include "segmentinformation.h" #include "segment.h" #include <string> #include <sstream> #include <map> class SISegment { public: SISegment(); SegmentInformation CreateSegment(SegmentType type, unsigned int size); private: std::map<unsigned int, SegmentInformation> segments; }; #endif // SISEGMENT_H
beim Aufruf von
segments.insert(std::make_pair(id, newSegInfos));
bekomme ich ein segmentation fault. Ich habe im Konstruktor die map initialisiert, daran sollte es also nicht liegen. Um ehrlich zu sein weiß ich nicht mehr so wirklich weiter. Muss auch zu geben, dass es einwenig her ist, seit dem ich das letzte mal C++ entwickelt habe.
Bin für jeden Hinweis dankbar.
-
Sieh dir mal diese 2 Zeilen genauer an:
std::map<unsigned int, SegmentInformation>::iterator it = segments.end(); SegmentInformation SegInfos = (*it).second;
Worauf zeigt it?
-
Zeile 13 im Sourcefile.
Worauf zeigt der Iterator, den end() zurückliefert?
-
Ah, habe gerade gelesen, end() liefert nur "ein theoretisches" Element zurück, nicht das wirklich letzte. Ok, da muss ich nochmal nachbessern. Beim ersten aufruf der Methode wird der If Block jedoch nicht ausgeführt, da die map leer ist. Trotzdem gibt es beim Insert ein Segmentation fault.
-
kelox schrieb:
Ah, habe gerade gelesen, end() liefert nur "ein theoretisches" Element zurück, nicht das wirklich letzte. Ok, da muss ich nochmal nachbessern. Beim ersten aufruf der Methode wird der If Block jedoch nicht ausgeführt, da die map leer ist. Trotzdem gibt es beim Insert ein Segmentation fault.
Da hast du wohl was falsch verstanden. Alle Elemente eines Containers befinden sich in der Range
[begin, end)
.end
zeigt also auf kein Element. Das hat auch gute Gründe:end-begin
==> Anzahl Elementebegin==end
==> Leerend
kann als Kriterium für nicht gefunden/nicht vorhanden hergenommen werden.
-
Wäre denn folgendes korrekt?
if(segments.size() != 0) { std::map<unsigned int, SegmentInformation>::reverse_iterator it = segments.rbegin(); SegmentInformation SegInfos = (*it).second; id = SegInfos.segmentId + 1; }
Laut cplusplus.com gibt rbegin() das letzte Element zurück.
-
Ja.
Und warum schreibst du nicht it->second?
-
Nathan schrieb:
Ja.
Und warum schreibst du nicht it->second?ja, ok, wäre wahrscheinlich intuitiver. Mein eigentliches Problem, dass es bei dem insert zu einem segmentation fault kommt besteht aber noch immer.
-
Dann entsteht der Segfault nicht in dem gezeigten Code, sondern irgendwo anders und tritt nur dort hervor.