static initialisierung
-
Kann ich eine static Klassenvariable mit new initialisieren?
std::vector<unsigned int>* cGO_baseObj::lastId = new std::vector<unsigned int>;Der compiler hat keine probleme damit aber ich bekomme nach einer weile einen Fehler: corrupted double linked list und frage mich ob das vielleicht damit etwas zu tun hat.
Die zeile steht in der cpp von cGO_baseObj.
-
Klar kannst du das...
Du wirst in deinem Programm wohl an anderer Stelle undefiniertes Verhalten haben.
Aber eine andere Frage:
Warum erstellst du das Objekt überhaupt mit new?
Also warum hast du einen Zeiger auf einen Vektor?
-
weil ich den vector manchmal auswechle durch einen anderen.
Ich dachte das müsste ich machen damit ich ihn nicht verliere.
Aussedem war ich mir nicht sicher wie das mit dem static und dem Speicherreservieren ist. Da wird ja irgendwie bei programmstart der Speicher reserviert und da ist die größe des Vectors ja noch 0.
Wenn ich nun einen neuen Integer anhänge wird dann speicher auf dem Heap reserviert?
oder wie läuft sowas dynamisches bei vectoren ab?
-
muli schrieb:
weil ich den vector manchmal auswechle durch einen anderen.
Ich dachte das müsste ich machen damit ich ihn nicht verliere.Was wechselst du aus? Den kompletten Vektor?
muli schrieb:
Aussedem war ich mir nicht sicher wie das mit dem static und dem Speicherreservieren ist. Da wird ja irgendwie bei programmstart der Speicher reserviert und da ist die größe des Vectors ja noch 0.
korrekt. Du kannst neue Elemente hinzufügen ohne Probleme befürchten zu müssen.
Intern wird dort auf einen mit new (bzw. ich glaube malloc) angelegten Speicherbereich
verwiesenmuli schrieb:
Wenn ich nun einen neuen Integer anhänge wird dann speicher auf dem Heap reserviert?
Genau...
-
Ja ich wechsel den kompletten vector aus?
-
muli schrieb:
Ja ich wechsel den kompletten vector aus?
Das müßte auch hübsch mit swap klappen.
-
Wenn du einen vector auswechseln willst, kannst du ihm einfach einen anderen zuweisen. Da braucht man nicht new, zeiger oder sonstwas dafür.
wenn du einen Vector nicht verlieren willst warum nimmst du nicht vector<vector<datentyp> > somit kannst du immer auf alte vectoren zugreifen.
-
Schon mal gut zu wissen das ich die einfach austauschen kann... und die jetzt alle in einen Vector zu stecken ist auch eine gute Idee...
Aber ich wuerde gerne zu meinem eigentlichen problem zurueck... Der fehler tritt sporadisch an verschiedenen stellen auf
Ich habe eine Stelle an der er mit sicherheit auftritt: und zwar im Konstruktor einer abgeleiteten Klasse... dort tritt er an einer stelle auf in der ich einen Stringstream fuelle. Da ich im code an dieser stelle keinen Fehler habe denke ich schon vorher irgendwo etwas mit dem loeschen oder erstellen von objekten falsch gemacht zu haben:
So nun meine Fragen:
Ich habe einen Vector mit pointern zu basisKlassneObjeketen.
Wenn ich diese nun mit delete loesche muss ich ja nicht in den korrekten typ casten wenn der Destruktor virtual ist oder?
Wenn nun einer dieser Pointer korrupt ist tritt der Fehler dann nicht sofort auf... da ja gar kein objekt an dieser stelle zu finen ist?Wie debugge ich so einen Fehler am besten... Also wie finde ich herraus welche double linked List corrupt ist und am besten auch wann das geschieht.
-
muli schrieb:
Ja ich wechsel den kompletten vector aus?
Darf ich mal nach dem konkreten Anwendungsfall fragen?
Also generell gibt es zwar Fälle, in denen man sowas braucht, jedoch
nach meiner Meinung nach relativ selten...
-
muli schrieb:
Aber ich wuerde gerne zu meinem eigentlichen problem zurueck... Der fehler tritt sporadisch an verschiedenen stellen auf
Wie gesagt... Irgendwo undefiniertes Verhalten...
Ohne weiteren Code wird es schwierigmuli schrieb:
Ich habe einen Vector mit pointern zu basisKlassneObjeketen.
Wenn ich diese nun mit delete loesche muss ich ja nicht in den korrekten typ casten wenn der Destruktor virtual ist oder?Korrekt... Wenn der der Destruktor der Basisklasse(!!!) virtuell ist...
muli schrieb:
Wenn nun einer dieser Pointer korrupt ist tritt der Fehler dann nicht sofort auf... da ja gar kein objekt an dieser stelle zu finen ist?
Der Fehler tritt in der Regel bei der ersten Dereferenzierung auf...
muli schrieb:
Wie debugge ich so einen Fehler am besten... Also wie finde ich herraus welche double linked List corrupt ist und am besten auch wann das geschieht.
Probier es mal mit dem gdb... (falls du den gcc verwendest)