Segmentation Fault bei Vector
-
Hallo,
gibt es eine Erklärung, warum ich bei folgendem zweiten std::cout-Aufruf einen Segmentation Fault bekomme, während der erste Aufruf ohne Probleme klappt?
Dingsbums* dings = new Dingsbums(...); std::vector<Dingsbums*> vec(0); std::cout << dings->getDings() << std::endl; vec.push_back(dings); std::cout << dings->getDings() << std::endl;Kann es mir absolut nicht erklären..
-
Die Fehlerstelle ist nicht immer die Stelle, wo du was falsch machst.
-
Das wird definitiv daran liegen, dass in der Methode
getDingsirgendetwas abläuft, sodass beim zweiten Aufruf etwas schiefgeht.
Dass hat
1. mitvectornichts zu tun.vectorspeichert einfach nur einen Zeiger ab. Das wars.
2. wahrscheinlich eine Ursache, die auf fehlendes RAII in deinem Code zurückzuführen ist.Zeige mal die Definition von
DingsbumsundgetDings.P.S.: Wieso gibst du die Länge beim
vectorals 0 an? Dann lass es doch gleich weg.
-
Okay. Ich melde mich morgen noch einmal, da ich den Code gerade nicht zur Hand habe. Die get-Methode ist aber eigentlich nur ein einfacher getter, der eine double-Variable zurückgibt. Deswegen konnte ich mir auch dort den Fehler nicht erklären.
Der Code ist vereinfacht. Eigentlich wird der Vektor im Konstruktor des Objektes initialisiert und dann passiert beim Aufruf der Funktion folgendes:
public Klasse1::methode(double wert) { Klasse2* ptr = new Klasse2(wert); vec.push_back(ptr); return ptr; }Wenn ich das so stehen habe erhalte ich den Fehler in der return-Anweisung.
PS: Schaden tut das mit der 0 aber doch auch nicht. Ich finde es irgendwie übersichtlicher so.
-
Schaden tut das mit der 0 aber doch auch nicht. Ich finde es irgendwie übersichtlicher so.
Es ist falsch so zu denken, weil dann andere Programmierer verwirrt werden könnten. Hier nicht, aber bei anderen "Schreibweisen" schon.
Wenn ich das so stehen habe erhalte ich den Fehler in der return-Anweisung.
Was ist denn der Rückgabewert? Vielleicht muss da ja konvertiert werden und ...
-
Deine Codes sind zu stark vereinfacht, nicht einmal grundlegende Syntax ist richtig. Siehe bitte:
http://www.c-plusplus.net/forum/304133Aber wie Sone schon gesagt hat, der Fehler ist an mit Sicherheit grenzender Wahrscheinlichkeit auf die Nichtbenutzung von RAII zurück zu führen. Höchstwahrscheinlich brauchst du nicht einmal manuelle Speicherverwaltung.
-
Sone schrieb:
Schaden tut das mit der 0 aber doch auch nicht. Ich finde es irgendwie übersichtlicher so.
Es ist falsch so zu denken, weil dann andere Programmierer verwirrt werden könnten. Hier nicht, aber bei anderen "Schreibweisen" schon.
Naja, es impliziert, dass die 0 eine besondere Bedeutung hat. Und das muss man erstmal verstehen als dritter. Sei es, dass der Vector leer sein soll oder dass da sonstwas passieren soll.
-
Skym0sh0 schrieb:
Naja, es impliziert, dass die 0 eine besondere Bedeutung hat. Und das muss man erstmal verstehen als dritter. Sei es, dass der Vector leer sein soll oder dass da sonstwas passieren soll.
Das stimmt, das impliziert es.
Nun, ich habe es sofort erkannt (mir wie dir sind die Konstruktoren gut bekannt), aber es macht den Code eben einfach weniger lesbar.
-
Mir ist der Konstruktor auch bekannt, aber ich hatte trotzdem einen "hä?" Moment.
Weil es einfach unüblich ist die Grösse explizit anzugeben, wenn man eh nen leeren Vektor haben will.Bei anderen Sachen sieht man oft dass explizit das Default-Verhalten angegeben wird. z.B. Klassen die mit
private:anfangen, oder explizitesprivatebei Basisklassen von Klassen (bzw. explizitespublicbei Basisklassen von Structs).
Odervirtualbeim Überschreiben von virtuellen Methoden.
Oder einreturn 0;am ende dermain()Funktion
Da ist man es gewohnt, und liest einfach drüber.
Bei anderen Dingen denkt man dann aber schnell "das würde nicht da stehen wenn es nicht da stehen müsste", und braucht dann ein paar Sekunden um zu checken dass es wirklich redundant ist.
-
Ich habe den Fehler mittlerweile gefunden.
public Klasse2* Klasse1::methode(double wert) { Klasse2* ptr = new Klasse2(wert); vec.push_back(ptr); return ptr; }Es lag nicht an der Funktion sondern an dessen Aufruf:
Klasse1 obj = new Klasse1(); double wert = 4; aufruf2(test[wert], obj->methode(wert));Der Fehler lag daran, dass in der Map test der Wert nicht vorhanden war. Wieso der Fehler allerdings dann innerhalb der Methode angezeigt wird ist mir ein Rätsel. Danke jedenfalls für die Hilfe.