warum ist dieser locale vector so lange gültig?
-
heyho,
ich habe grad ein wenig herumgebastelt, und habe mir eine map gebastelt, in der ich anhand von einem int index vectoren gefüllt mit objecten speichere.
es funktioniert ja ziemlich gut, aber was mich dennoch stutzig macht, ich erstelle diesen vector local, allerdings ist er so lange gültig, wie die map gültig ist (die map ist ein member einer klasse).
das wäre ein verhalten, was ich einem garbage collector zuordnen würde, allerdings nicht c++, weil, hier hab ich ja gelernt, locale objecte bleiben nur so lange gültig, bis der block verlassen wird.hier mal ein kleines code beispiel, was ich damit meine:
objectItr = m_v2VisibleObjects.find((*itr)->GetPositionY()); if (objectItr == m_v2VisibleObjects.end()) { std::vector<WorldObject*> newVector; newVector.push_back(*itr); m_v2VisibleObjects.insert(std::make_pair<int, std::vector<WorldObject*>>((*itr)->GetPositionY(), newVector)); } else objectItr->second.push_back(*itr);die objecte, mit denen ich die vectoren fülle, sind vorhanden und werden nicht extra erstellt. es ist lediglich der vector, den ich hier local erstelle.
mfg
-
Der vector, den du erstellt hast, wird auch bei Beenden des Scopes wieder zerstört. make_pair erzeugt ein pair mit einer Kopie des vector als Member. map::insert wiederum speichert eine Kopie des vectors im pair (mit C++0x wird der vector aus dem pair in die map gemoved, ist nicht so teuer wie eine komplette Kopie)
-
anti-freak schrieb:
die objecte, mit denen ich die vectoren fülle, sind vorhanden und werden nicht extra erstellt. es ist lediglich der vector, den ich hier local erstelle.
Da liegt der Denkfehler, der vector wird nämlich kopiert. Da du ihn make_pair mit call by value übergibst, wird er ein erstes mal kopiert, wenn du das pair in die Objekte einfügst wird er ein zweites Mal kopiert. Wenn du einen guten Compiler hast, optimiert dieser die zweite Kopie heraus, aber das Verhalten bleibt.
-
aha! dankeschön

und ein map.clear() erzeugt dann keinen memoryleak? (also der vectoren, die objecte sind ja seperat vorhanden)
-
anti-freak schrieb:
aha! dankeschön

und ein map.clear() erzeugt dann keinen memoryleak? (also der vectoren, die objecte sind ja seperat vorhanden)Wenn du die WorldObject-Pointer woanders nicht hast, dann schon. Map.clear() löscht die vectoren, aber die sorgen nicht dafür, dass auf den Pointern delete aufgerufen wird. Vielleicht sind smartpointer da angebracht.
-
jo, das meinte ich.
was meinst du mit smartpointern?
welche vorteile würden die bringen?EDIT: die WorldObjecte sind wo anders vorhanden, das hier dient lediglich der verwaltung, welche sichtbar sind, also sich auf dem bildschirm befinden.
-
Sie können memleaks verhindern. Deiner Frage entnehme ich, dass du smartpointer noch nicht kennst. Google wird dir über das Thema sicher mehr verraten können.