Richtige Speicherverwaltung
-
Hi
Ich arbeite jetzt schon längere Zeit mit dem Borland und stelle mir oft die Frage ob ich richtig mit dem verfügbaren Speicher umgehe.
Dazu habe ich einige konkrete Fragen.
Was ist z.B. mit AnsiStrings? sollte ich diese mit delete& freigeben sobald ich sie nicht mehr brauche oder muss ich mir darum keine Sorgen machen?
Was ist mit char-Arrays? Für WinApi-Aufrufe brauche ich ja öffter mal welche.
Sollte ich in diesem Beispiel das Array lieber mit new erstellen und dann wieder mit delete löschen?char cBuf[MAX_PATH]; GetWindowsDirectory(cBuf, sizeof(cBuf));Kann ich mir sicher sein, dass ein innerhalb einer Klasse mit new erstelltes Array mit delete korrekt gelöscht wird?
class TColorArray { public: TColorArray(int size) { Size=size; Colors=new TColor[Size]; } ~TColorArray() { Size=0; delete Colors; Colors=NULL; } int Size; TColor *Colors; };Ja das sind eigentlich so meine dringensten Fragen.
Wäre nett wenn mir die jemand beantworten könnte.Gruß
rean
-
Hallo
um dich zu beruhigen : Speicherverwaltung ist keine Hexerei. Grundsätzlich gilt : zu jedem new gehört ein delete, was du nicht manuell erstellst must du auch nicht manuell löschen. Es gibt Aussnahmen... die meistens in kompletten Frameworks wie der VCL gelten, wo sie aber auch dokumentiert sind. Beispiel die TComponent-Eigenschaft Owner.
Was ist z.B. mit AnsiStrings? sollte ich diese mit delete& freigeben sobald ich sie nicht mehr brauche oder muss ich mir darum keine Sorgen machen?
Siehe oben : AnsiString an sich ist ein Stackobjekt und löscht sich auf dem Stack wie int selber.
Was ist mit char-Arrays? Für WinApi-Aufrufe brauche ich ja öffter mal welche.
Sollte ich in diesem Beispiel das Array lieber mit new erstellen und dann wieder mit delete löschen? ...Nein, denn benutzt ja kein new.
Kann ich mir sicher sein, dass ein innerhalb einer Klasse mit new erstelltes Array mit delete korrekt gelöscht wird?
Ja, denn du hast einen korrektes Konstruktor/Destruktor-Paar. Allerdings ist im Destruktor wirklich nur das delete notwendig, alles andere nicht.
Tip : Belies dich über die üblichen Internetquelklen zum Thema RAII. Zudem solltest du unbedingt wirklich die Grundkenntnisse von C++ an sich kennen, bevor du cih in OOP und Frameworks wirfst.
bis bald
akari
-
Also ich finde schon dass ich die Grundkenntnisse in C++ beherrsche.
Die Sache ist nur, dass jeder zu diesem Thema was anderes erzählt.
Meine Lehrer können sich nicht einigen und der C++Freak in meiner Klasse labert irgendwas ganz komisches.Wollte mich einfach nur nochmal absichern.
Danke für deine schnellen und kompotenten Antworten.
-
Achtung: Du hast nicht new, sondern new[] benutzt. Also bitte mit delete[] den Speicher freigeben. Wenn Du statt dessen delete nimmst, gibst Du nur das erste Element frei!
Colors=new TColor[Size]; delete[] Colors;Gruß,
Christian
-
Hallo
jetzt hab doch glatt was übersehen

natürlich darfst du auch new[]/delete[] und new/delete nicht mischen.bis bald
akaei
-
Ok. Nochmal Danke
