Zum Inhalt springen

[C++] Frage zum unterschied Instanzierung von Klassen (Stack/Heap)


Empfohlene Beiträge

Geschrieben

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.

Geschrieben
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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...