• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Ganz dumme Frage (OOP)

Mitglied seit
09.11.2002
Beiträge
880
Reaktionen
0
Ich habe quasi gestern angefangen, mich mit objektorientierter Programmierung zu befassen. Und da habe ich gleich mal eine ganz blöde Frage:
Wenn ich beim Erstellen eines Objektes (im Constructor, heißt das wohl), oder auch durch eine Funktion des Objektes, Speicher anfordere (malloc()), wird der dann automatisch wieder freigegeben wenn ich das Objekt lösche, oder muß ich den explizit im Destructor über free() wieder freigeben?
Und was für Auswirkungen hat es, wenn ich ihn nicht freigebe? Ist der dann für immer weg, oder wird der spätestens beim Beenden des Programms wieder verfügbar (oder anders: Wie ernst ist das Problem, muß ich mich wirklich darum kümmern?)

Danke!
 

zhxb

Casino Port Zion, Community-Forum, SC2 Kontaktbörs
Mitglied seit
24.06.2005
Beiträge
2.647
Reaktionen
0
Ort
Berlin
Normalerweise wird beim loeschen eines Objektes (bzw der Referenz) der Speicherplatz automatisch wieder freigegeben, wobei ich anmerken muss nicht allzuviel von der Materie zu verstehen :bored: Um welche objektorientierte Programmiersprache handelt es sich eigentlich (deine Befehle)?
 
Mitglied seit
03.08.2002
Beiträge
707
Reaktionen
0
Wenn ich beim Erstellen eines Objektes (im Constructor, heißt das wohl), oder auch durch eine Funktion des Objektes, Speicher anfordere (malloc()), wird der dann automatisch wieder freigegeben wenn ich das Objekt lösche, oder muß ich den explizit im Destructor über free() wieder freigeben?

ohne garbage collection musst musst du free() aufrufen.

Und was für Auswirkungen hat es, wenn ich ihn nicht freigebe? Ist der dann für immer weg, oder wird der spätestens beim Beenden des Programms wieder verfügbar

das ist betriebssystemabhängig, aber gewöhnlich wird er wieder verfügbar.

(oder anders: Wie ernst ist das Problem, muß ich mich wirklich darum kümmern?)

fehler sollte man grundsätzlich vermeiden.
 

Clawg

Guest
Mal angenommen, dass es sich um C++ handelt, musst du jeden Speicherbereich, den du mit 'new' (malloc ist boese) belegt hast, wieder mit delete (free ist boese) freigeben.
Ausnahme bilden Variablen im Heap, z.B. int i[100]; wird automatisch freigeben, sobald die Funktion zuende oder die Klasse geloescht wird.

Soweit ich mich erinnern kann ruft 'malloc' und 'free' nicht den Konstruktor bzw. Destruktor auf, im Zusammenhang mit Klassen also nicht so toll :>

Wenn du's etwas fortschrittlich haben willst, gibt es auch sogenannte 'autopointer', das sind Klassen, die die selbe Schnittstelle wie pointer haben (z.B. Zugriff ueber [] oder *), allerdings mit eigenem Destruktor.

Wie ernst ist das Problem, muß ich mich wirklich darum kümmern?
Wenn du keine Objekte waehrend des Programmlaufs loeschst, musst du dich ueberhaupt nicht darum kuemmern, da das Betriebssystem am Ende des Programms den Speicher freigibt.
Die Situation tritt wohl aber nur bei sehr einfachen Programmen auf :)
 
Mitglied seit
18.07.2001
Beiträge
2.152
Reaktionen
2
Ort
Nürnberg
claw verwechselt da wohl was. variablen auf dem stack werden in c++ automatisch aufgeraeumt wenn der stack abgebaut wird. mit malloc() oder new() angelegte dinge landen im heap(freispeicher) und muessen wieder aufgeraeumt werden, entweder manuell oder von der autopointer class (die selbst wiederum auf dem stack liegt).
 
Mitglied seit
09.11.2002
Beiträge
880
Reaktionen
0
Danke für die bisherigen Antworten.
Ja, ich verwende C++. Mit dem Qt Toolkit.
OK, ich werde also "von Hand" aufräumen. Aber warum ist malloc() und free() so schlecht? Der Kompiler kompiliert das ohne zu meckern und es läuft auch ohne Segmentation faults - allerdings macht das Programm noch nicht allzu viel, will erst heute die benötigten Funktionen einbauen.

Wenn ich testen möchte, ob der Speicher wirklich ordnungsgemäß freigegeben wird, kann man nicht einfach mal 500MB anfordern und dann den verfügbaren freien Hauptspeicher vor, während und nach Programmaufruf kontrollieren? Ist halt bischen blöd wenn's schiefläuft, möchte den PC im Moment ungerne neu booten.
 

4GT_DosX

Guest
malloc() und free() sind die Überbleibsel aus C.
Wenn du schon mit Objekten programmierst, solltest du auch die Objektfunktionen new und delete für CPP verwenden.

Siehe auch hier:

[16.4] Why should I use new instead of trustworthy old malloc()?

Constructors/destructors, type safety, overridability.

* Constructors/destructors: unlike malloc(sizeof(Fred)), new Fred() calls Fred's constructor. Similarly, delete p calls *p's destructor.
* Type safety: malloc() returns a void* which isn't type safe. new Fred() returns a pointer of the right type (a Fred*).
* Overridability: new is an operator that can be overridden by a class, while malloc() is not overridable on a per-class basis.

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.4
 
Oben