Funktion verändert maps ohne (offensichtlichen) Zugriff darauf
-
Hallo,
ich arbeite an einem divide & conquer Algorithmus und habe dabei das folgende Problem:
Ich habe eine eigene Klasse EDGE und die zwei Mapsmap<EDGE*, list<EDGE*>, EDGE_CMP> Q; map<EDGE*, list<EDGE*>, EDGE_CMP> cov;Damit initialisiere ich vier neue Maps:
map<EDGE*, list<EDGE*>, EDGE_CMP> Q_copy_1(Q); map<EDGE*, list<EDGE*>, EDGE_CMP> Q_copy_2(Q); map<EDGE*, list<EDGE*>, EDGE_CMP> cov_copy_1(cov); map<EDGE*, list<EDGE*>, EDGE_CMP> cov_copy_2(cov);Dann rufe ich die Funktion
void shrink(list<EDGE*>& shrink_edges, map<EDGE*, list<EDGE*>, EDGE_CMP>& Q, map<EDGE*, list<EDGE*>, EDGE_CMP>& cov);mit Q_copy_1 und cov_copy_1 als Argumente 2 und 3 auf. Die Funktion verändert die beiden maps in gewisser Weise.
Komischerweise sind nach diesem Funktionsaufruf auch Q_copy_2 und cov_copy_2 auf die gleiche Weise verändert. Kann mir das jemand erklären?
Danke für die Hilfe!
-
Also wenn ich mal raten darf (denn mehr lässt dein Code nicht zu):
Du erwartest möglicherweise, dass
map<EDGE*, list<EDGE*>, EDGE_CMP> Q_copy_1(Q);eine sogenannte deep copy von Q macht. (Schlag das nach, wenn du nicht weißt, was das heißt). Es wird aber bloß eine shallow copy gemacht. Falls du dann in deiner Funktion Änderungen an den Objekten machst, auf die die Pointer in deiner map zeigen, dann veränderst du auch die Elemente auf die die Pointer in den anderen Maps zeigen, denn es sind die selben.