PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Frage zu new und delete


Baalzamon
2005-11-05, 12:46:35
Hallo,

als Java-Programmierer bin ich es gewohnt einen Garbage-Collector zu haben, welcher hinter mir aufräumt. Da dies in C++ nicht so ist, habe ich bei zwei Sachen ein Verständisproblem was die Speicherzuweisung betrifft, vielleicht kann mir ja jemand helfen.

Fall 1:

In einer Methode wird als Rückgabewert ein neues Objekt erstellt.

Object* getObject()
{
return (new Object());
}

// snip

// Wenn ich sowas mache ist klar, das ich den Speicher mit delete freigeben kann.
Object* obj = getObject();
delete obj;

// Was passiert mit dem Speicher bei sowas?
getObject();


Wenn ich den Rückgabewert von getObject() nicht benutze (d.h. nicht sowas wie obj = getObject();) was passiert mit dem allokierten Speicher?


Fall 2: Decorator Pattern
Der ein oder andere kennt das Pattern vielleicht, ansonsten kann man es bestimmt auch irgendwo nachlesen. Ganz kurz: Decorator und Object implementieren dasselbe Interface und der Decorator bekommt immer ein Object mit in den Konstruktor übergeben. Mein Problem dabei ist, das ich nicht genau weiss was passiert wenn man z.b. sowas macht:


Object* obj = new Decorator(new OtherDecorator(new Object()));
delete obj;


Lösche ich mit delete den kompletten allokierten Speicher? Wie verhalten sich die geschachtelten new?

Aqualon
2005-11-05, 13:22:01
Fall 1 bleibt der allokierte Speicher natürlich erhalten, weil kein delete aufgerufen wird. Du kannst aber z.B. delete getObject(); schreiben, dann wird das Objekt trotzdem erstellt und danach gleich wieder gelöscht.

Fall 2 weiß ich leider auch nicht, würd mich aber ebenso interessieren.

Falls du unter Linux arbeitest, kannst du z.B. valgrind benutzen, um Speicherlecks rauszufinden.

Aqua

Marscel
2005-11-05, 14:57:57
Lösche ich mit delete den kompletten allokierten Speicher? Wie verhalten sich die geschachtelten new?

Kann man das nicht herausfinden, indem man die Destruktoren der Klassen eine Aktion durchführen lässt (Ausgabe etc.)?

Trap
2005-11-05, 15:16:53
1. Man kann auch C++-Programme mit GC erzeugen: http://www.hpl.hp.com/personal/Hans_Boehm/gc/

Lösche ich mit delete den kompletten allokierten Speicher? Wie verhalten sich die geschachtelten new?
Nein. Delete sorgt nur dafür dass das Objekt auf das der Zeiger zeigt gelöscht wird.

Alles weitere musst du selbst in den Destruktor der Klasse für die delete aufgerufen wird schreiben. Wenn die Klasse von einer Basisklasse abgeleitet ist sollte die Basisklasse einen virtuellen Destruktor haben (damit polymorph der richtige Destruktor aufgerufen wird).

Coda
2005-11-05, 19:16:34
Einfache Regel: Für jedes new ein delete und für jedes new[] ein delete[].

Baalzamon
2005-11-07, 16:25:16
Vielen Dank euch allen, das hat mir schon sehr weitergeholfen.