Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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.

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.