PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Beziehung zwischen zwei Objekten speichern


jo
2007-10-05, 09:09:07
Hi

Ich möchte eine Beziehung zwischen zwei Objekten speichern. Dazu habe ich mir überlegt das in eine std::map<ObjA*,ObjB*> zu tun. Aber ist es wirklich klug hier die Pointer bzw. Adressen der Objekte zu speichern? Dies scheint erstmal zu funktionieren, aber ist das auch Fehlerrobust oder kann man das evtl. anders/besser machen?

thx

Coda
2007-10-05, 09:36:04
Ist okay solange du die Objekte nicht z.B. in einem std::vector hälst, weil dessen Elemente sich im Speicher verschieben können.

Gast
2007-10-05, 10:21:33
Danke!

Im Vector verschieben sich also die Objekte möglicherweise, das ist gut zu wissen. Also eine Adresse auf einen Punkt außerhalb des Vectors in eben diesen zu packen geht, aber wenn ich sowas mache, kann (bzw. wird) das zu Fehlern führen?

std::vector<int> iv;
...
int* pi = &iv[0];

Kann ich dieses Verhalten beim Vector irgendwie provozieren? Würde das gern mal im Debugger betrachten...

Betrifft das auch die anderen Container vollständig bzw. teilweise?

Gast
2007-10-05, 10:29:46
Danke!

Im Vector verschieben sich also die Objekte möglicherweise, das ist gut zu wissen. Also eine Adresse auf einen Punkt außerhalb des Vectors in eben diesen zu packen geht, aber wenn ich sowas mache, kann (bzw. wird) das zu Fehlern führen?
es kann sogar sein dass der vector komplet neu angelegt wird, dann wird natuerlich der alte geloescht und es ist alles worauf du zeigst auch weg.



std::vector<int> iv;
...
int* pi = &iv[0];

Kann ich dieses Verhalten beim Vector irgendwie provozieren? Würde das gern mal im Debugger betrachten...

iv.resize(10000);//sollte mit iv.reserve(10000); auch gehen


Betrifft das auch die anderen Container vollständig bzw. teilweise?
grundsaetzlich sollte man container als blackboxen ansehen von denen man nicht weiss was sie mit den daten anstellen. wenn man sich darauf verlaesst, dass z.b. ein container 'stabil' ist solange man ihn nicht resized, wird das entweder schiefgehen wenn man vergisst dass man sich darauf verlaesst bzw wenn jemand anderes damit arbeitet. zudem kann das zu skurilen programmierideen fuehren, z.b. dass jemand grundsaetzlich immer reserver(10000) bei jedem vector macht, weil er hofft dass das reicht und somit nie was umgelagert wird.

die einfache loesung waere sich nicht die objekte selbst im container zu halten, sondern pointer darauf, wenn auch das wenig effizient bei 'int' waere.

Gast
2007-10-05, 11:46:30
iv.resize(10000);//sollte mit iv.reserve(10000); auch gehen
Danke. War interessant das mal mitzuerleben... :)