wird bei map[] der Destructor aufgerufen?
-
Hallo,
ich habe eine map<int, Foo> m;
wenn ich da jetzt ein Foo abspeichere und danach an der selben Stelle ein anderes, wird dann das alte Objekt zerstoert (also mit Destructoraufruf)?Foo foo1; Foo foo2; m[2] = foo1; m[2] = foo2; // Wird an dieser Stelle foo1 zerstoert?
-
Nein, das wär ja fatal, da foo1 noch im Scope ist. Das in der Map gespeicherte Objekt wird auch nicht zerstört und neukonstruiert, es wird der Zuweisungsoperator des in der Map gespeicherten Objekts mit foo2 als Parameter aufgerufen.
-
Hm, das ist aber schlecht.
Mein Foo hat naemlich als Member mehrere Smartpointer:
class Foo { ref_ptr<Group> group; ref_ptr<Object> object; ... }wenn jetzt in map[2] schon ein Foo steht, dann soll das alte weggeworfen und zerstoert werden. Wobei... Foo::operator= ruft dann ja fuer alle Member operator= auf, was bei Smart pointer ja dann doch passen wuerde, oder?
-
Das sollte besser passen, ja, sonst wäre der Zuweisungsoperator falsch.
-
Saftladen schrieb:
m[2] = foo2; // Wird an dieser Stelle foo1 zerstoert?Nein. Das was in der Map ist, hat sowieso nichts mehr mit foo1 zu tun, da es nur eine Kopie davon ist. Wenn du foo1 in der Zwischenzeit zerstört oder verändert hättest, hätte m[2] nichts davon mitbekommen. Andersrum bekommt foo1 nichts von dem mit, was du mit m[2] anstellst.
-
pumuckl schrieb:
Saftladen schrieb:
m[2] = foo2; // Wird an dieser Stelle foo1 zerstoert?Nein. Das was in der Map ist, hat sowieso nichts mehr mit foo1 zu tun, da es nur eine Kopie davon ist. Wenn du foo1 in der Zwischenzeit zerstört oder verändert hättest, hätte m[2] nichts davon mitbekommen. Andersrum bekommt foo1 nichts von dem mit, was du mit m[2] anstellst.
Ja, ich hab mich missverstaendlich ausgedrueckt. Ich meinte, ob das Foo IN der Map zerstoert wird. Also Destructor aufruf. Aber das ist ja offenbar nicht der Fall.
-
Saftladen schrieb:
pumuckl schrieb:
Saftladen schrieb:
m[2] = foo2; // Wird an dieser Stelle foo1 zerstoert?Nein. Das was in der Map ist, hat sowieso nichts mehr mit foo1 zu tun, da es nur eine Kopie davon ist. Wenn du foo1 in der Zwischenzeit zerstört oder verändert hättest, hätte m[2] nichts davon mitbekommen. Andersrum bekommt foo1 nichts von dem mit, was du mit m[2] anstellst.
Ja, ich hab mich missverstaendlich ausgedrueckt. Ich meinte, ob das Foo IN der Map zerstoert wird. Also Destructor aufruf. Aber das ist ja offenbar nicht der Fall.
Du kannst das alte Foo mit erase löschen und dann das neue hinzufügen. Allerdings sollte dein Zuweisungsoperator so implementiert sein, dass das keinen Unterschied, nur schlechtere Performance, ergibt.
-
Saftladen schrieb:
Ja, ich hab mich missverstaendlich ausgedrueckt. Ich meinte, ob das Foo IN der Map zerstoert wird. Also Destructor aufruf. Aber das ist ja offenbar nicht der Fall.
Ein map-Zugriff liefert dir eine Referenz auf das Objekt (oder falls das Element noch nicht existiert eine Referenz auf ein neu angelegtes Element). Was du mit diesem Element machst, ist deine Sache. Hier rufst du durch das '=' einen Zuweisungsoperator auf. Die map selber macht garantiert nichts eigenes beim Zugriff.