Seg-Fault Fehler
-
Hallo zusammen,
ich habe hier mal wieder ein Problem, wo ich denke ich habe überhaupt keine Ahnung von C++.

Ich habe einen Klasse, welche einen Timer per new erstellt, den Pointer sich in einer Datenstruktur merkt und die Datenstruktur in einen vector speichert. Wenn ich die Datenstruktur aus dem vector raushole (nach einiger Zeit), ist der Timer defekt, heißt er zeigt auf sinnlose Speicherbereiche. Hier in kurz, was ich mache:
LTTimer * timer = new LTTimer(...); State state; state.setTimer(timer); stateList.push_back(state); ... etwas später ... State state = stateList.find(....); //finde das passende Stateobjekt LTTimer * timer = state.getTimer(); timer->foo(....) // <<-- krachtDie Methode state.setTimer(timer); ist:
void setTimer(LTTimer * timer){ this->timer = timer; }Wenn ich statt dessen:
void setTimer(LTTimer * timer){ this->timer = new LTTimer(timer); }Läuft es durch. Erzeugt natürlich Speicherlöcher ohne Ende, lässt mich aber vermuten, dass der Seg-fault tatsächlich was mit dem merken des Timers zu tun hat. Oder übersehe ich noch was anderes? Was könnte mein Problem sein?
Vielen Dank schon einmal.

-
Der Code ist nicht schön, sollte aber funktionieren. Das es mit dem new im setTimer aufeinmal funktioniert ist schon sehr merkwürdig. Bist du sicher, dass dein ursprüngliches Timer Objekt nirgendwo gelöscht wird? Machen die LTTimer/State Copy-Konstruktoren irgendwas besonderes?
-
Hallo sebi707,
wie kann ich meinen Code schöner machen?
Im Constructor vom Timer mache ich:
if (!mt.ltTimerQueue.contains(getReference())) { mt.ltTimerQueue.add(this); }//end ifHier tut sich der Timer selber in eine Timerqueue bei seiner Mutter einreihen. Entfernen tut er sich selbst im Destructor:
LTTimer::~LTTimer() { mt.ltTimerQueue.remove(getReference()); }Könnte es daran liegen? Früher fand ich dies ne total tolle Idee, aber da gabs auch noch nicht das State objekt. Mh. Denke fast. Oder?
-
Du benutzt also nackte Zeiger mit new und delete, die hin und her kopiert werden, und irgendwann stürzt dein Programm ab, weil der Zeiger auf Müll zeigt. Könnte es da einen Zusammenhang geben?
-
Hallo manni,
na vom Prinzip hätte ich gedacht eigentlich nicht. Das Objekt, auf welches der Timer zeigt wird einmal angelegt. Dessen Adresse wird hin und her kopiert. Bei der ersten Nutzung vom Objekt, ist es Schrott. Zerstört soll das Objekt, auf welches der Pointer zeigt, erst viel viel später werden.
Der Pointer als solches ist doch quasi nur eine Zahl. Nebenläufigkeit gibt es nicht. Weiß daher nicht, was daran so schlimm sein soll ???.
-
Anders gefragt: Wie merke ich mir den die Adresse eines Objektes, welches ich irgendwann mal brauche?
-
Die Frage ist nicht, wie du dir eine Adresse merkst, sondern wer wann das delete aufruft. Bei Problemen, wie du sie schilderst, wird meistens der Zeiger nach dem Löschen verwendet. Beliebt ist dabei sicher auch, Objekte und damit auch den Zeiger stumpf zu kopieren und im Destruktor zu löschen => jede Kopie löscht den gleichen Wert.
So ein stateList.push_back(state) riecht schon danach.