Nachtschatten09 Geschrieben 4. Juni 2009 Geschrieben 4. Juni 2009 Hallo. Bin in nem C++ Buch darüber gestoßen das ein hängender Zeiger entsteht wenn ich ein Objekt einer Klasse instanziere, dass eine dyn. zugewiesene Zeigervariable enthält und ich dieses Objekt dann einer Funktion übergebe. Sozusagen zerstört der Destruktor der Kopie den Speicherbereich. So, habe dies ausprobiert, stimmt auch, weshalb aber passiert dieses Problem nicht, wenn man das Objekt per new instanziert und dann der Funktion übergiebt? Habs auch ausprobiert, sowohl die Kopie als auch das Original zeigen auf eine andere Adresse, aber warum? Hoffe mir kann jemand auf die Sprünge helfen. Zitieren
Klotzkopp Geschrieben 4. Juni 2009 Geschrieben 4. Juni 2009 Bin in nem C++ Buch darüber gestoßen das ein hängender Zeiger entsteht wenn ich ein Objekt einer Klasse instanziere, dass eine dyn. zugewiesene Zeigervariable enthält und ich dieses Objekt dann einer Funktion übergebe. Sozusagen zerstört der Destruktor der Kopie den Speicherbereich.Das passiert nur, wenn der Copykonstruktor nicht das tut, was er sollte: Den dynamisch angeforderten Speicher zu kopieren. Meistens liegt es daran, dass man gar keinen Copykonstruktor anlegt. Dann generiert der Compiler selbst einen. Der kann aber keinen dynamischen Speicher anfordern, er kopiert einfach nur den Zeiger. Eine Klasse, die dynamischen Speicher verwaltet, sollte entweder einen ordentlichen Copykonstruktor bereitstellen oder verhindern, dass sie überhaupt kopiert wird, ansonsten ist sie meiner Meinung nach kaputt. Es gibt die sogenannte "Regel der Großen 3": Wenn eine Klasse einen dieser drei (Copykonstruktor, Copy-Zuweisungsoperator, Destruktor) braucht, dann braucht sie alle drei. So, habe dies ausprobiert, stimmt auch, weshalb aber passiert dieses Problem nicht, wenn man das Objekt per new instanziert und dann der Funktion übergiebt? Es ist völlig egal, wie du das Objekt angelegt hast. Es kommt darauf an, wie du es übergibst. Die Kopie wird nur erstellt, wenn das Objekt "by value" übergeben wird. Bei einer Übergabe "by reference" passiert das nicht. Es passiert auch nicht, wenn du statt des Objekts einen Zeiger darauf übergibst - dann wird nämlich nur der Zeiger kopiert. Habs auch ausprobiert, sowohl die Kopie als auch das Original zeigen auf eine andere Adresse, aber warum?Zeig mal den Code dazu. Zitieren
Nachtschatten09 Geschrieben 4. Juni 2009 Autor Geschrieben 4. Juni 2009 :hells: Okay brauche den Code nicht mehr zu schreiben, habe versehentlich die Adresse der Klassenobjekte ausgegeben. Danke, dass mit der Übergabe war einleuchtend und logisch. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.