Fehler zur Laufzeit des Programms durch dynamisches Erzeugen von Instanzen auf eine Klasse?!?
-
Hallo ich bin es mal wieder

Habe immer noch Probleme mit meinen Threads.
Ja ich weiß C++ kennt keine Threads, da ich aber vermute das
der Fehler nicht unbedingt an den Threads selber liegt sondern
vielleicht an dem erzeugen der Instanzen auf die Threadhaltende
Klasse denke ich das die Frage hier richtig eingeordnet sein könnte.hier der CodeSchnipsel wie ich versuche dynamich eine Instanz zu erzeugen:
class TMainINIT : public TKonfiguration { public: ... protected: public: ... // vector zur Aufnahme beliebig vieler Fahrzeuginstanzen vector<TFahrzeug> FahrzeugInstanzen; vector<TFahrzeug>::iterator PosFahrzeugInstanzen; void CreateFahrzeugInstanz(); ... }; ... void TMainINIT::CreateFahrzeugInstanz() // Erzeug eine Neue Instanz auf Fahrzeug und speichert // sie in dem Fahrzeug vector { TFahrzeug NeuesFahrzeug; this->FahrzeugInstanzen.push_back(NeuesFahrzeug); }Das Problem hiemit ist wie sicher sofort auffält, das
TFahrzeug NeuesFahrzeug nur eine Lebensdauer von der länge der Funktion hat und danach aufhört zu existieren (Deconstruktor wird aufgerufen etc.)Daher bin ich mir nicht sicher ob diese Erzeugung mit für die Fehler, die ich zur Laufzeit des Programms bekomme verantwortlich sein könnte.
Obwohl es mit diesem Konstruckt bei nur einem Thread fehlerfrei läuft!?!die Fehler die auftreten lauten übrigens:
Damage after Normal Block (#.....)
oder
_BLOCK_TYPE_IS_VAILID_(CpHead->nBlockuse)Ich habe schon versucht den Fehler innerhalb meines Programmes mittels OnlineDebuging einzugreisen, Ohne Erfolg
, er tritt sporadisch
im geasammten Thread auf. Das einizige was ich mit Gewissheit sagen kann mit steigender Threadzahl nimmt auch die Häufigkeit dieser Fehler zu. *aaagh*Wenn jemand mir eine bessere Lösung für das dynamische erzeugen von Instanzen verraten kann, bin ganz Ohr.
Wenn Jemand noch genaueres über diese Fehler weiß, oder wie man solche Fehler einkreisen kann, ich bin für jeden Tipp dankbarGruß Wastman
-
Der Code sieht ok aus. Es wird eine Instanz erzeugt, und eine Kopie davon in den den Vector gelegt und anschliessend wird die erste Instanz gelöscht. Soweit ist das gültig und ok.
Wenn Du den Fehler da vermutest, dann solltest Du Dir anschauen, ob Dein Copy-Constructor richtig ist. Enthält z.B. TFahrzeug irgendwelche Pointer, die beim Kopieren mit kopiert werden und im Destruktor gelöscht werden?
Ausserdem solltest Du daran denken, dass deine Instanzen im vector nicht konstant sind, d.h. durch ein push_back kann es passieren, dass alle bisherigen Elemente umkopiert werden (d.h. es wird wieder der Copy-Construktor von TFahrzeug bemüht).Ggf. ist ein Arbeiten mit Pointern besser:
vector<TFahrzeug*> FahrzeugPointer; ... // in der Funktion FahrzeugPointer.push_back( new TFahrzeug());Du musst jetzt allerdings auch selbst dafür sorgen, den Speicher wieder freizugeben.
-
Sehe ich das richtig dass du von mehreren threads auf den vector FahrzeugInstanzen einer einzigen Instanz von TMainINIT zugreifst ?
Wenn das so ist brauchst du funktionen zur Thread-synchronisierung sonst krachts.
Kurt
-
Hmmm
Schon mal danke für den TipTFahrzeug enthält zwar Pointer, diese Werden aber erst bei allen Instanzen
gesetzt, nanchdem alle benötigten Instanzen erzeugt wurden.
--> Ich gehe den Vector Element für Element durch und setze dort die Pointer.
Danach wird bis zum Ende der Laufzeit des Programms keine neuen Fahrzeuge mehr angelegt.hmm.
Also kann ich das als warscheinliche Fehlerquelle streichen.
Werde dennoch nochmal kontrollieren, das da kein Pointer verschüt geht.
-
Na ja also MainINIT ist nur der Halter der ganzen Instanzen, unter anderem auch der Instanzen auf die Fahrzeuge. Das Fahrzeug selber greift nicht auf MainINIT zurück, sondern wird vor dem start von MainINIT mit allem versorgt , was es braucht. Die Komminikationen unter den Threads selber laufen über eine Klasse GlobalData und ThreadStatus, welche als Instanzen ebenfalls in MainINIT angelegt werden und dann an die einzelnen Fahrzeuge als Pointer bei der Initialisierung, nach dem Anlegen aller Fahrzeuge (siehe oben), weitergereicht wird. Das Schreiben und lesen in diesen beiden Klassen ist mittels Mutexen geschützt.
Wie gesagt der Fehler tritt sporadich, mit steigender Häufigkeit bei mehr Threads auf. D.H. wenn das Programm gut gelaunt ist berechnet es mir meine 3-X Fahrzeuge problemlos 30000 mal, oder es kamm auch schon vor das das Programm beim 10 Durchlauf mit Fehler abbgebrochen hat
-
Dann ist es ziemlich sicher ein Thread-Synchronisationsproblem.
-
Hmmm habe den Fehler gefunden.
War ein ThreadSynch Problem.
Allerdings in der dafür ungünstigsten Klasse ^^ in meiner Debug Klasse ...
*AAARGH* Das war ein sprichwörtlicher Teufelskreis...
Je mehr OnlineDebugging ich betrieben habe um den Fehler zu finden um so häufiger trat er auf an immer anderen Stellen ....Na ja Gut das der jetzt weg ist

Gruß Wastman