Speicher korrekt freigeben?
-
In meiner dialogbasierten Testanwendung stelle ich via Taskmanager fest,
dass der Speicher irgendwie zugemüllt wird (schleichend aber stetig).
Darum wollte ich euch fragen wie man korrekt den Speicher in den folgenden
Fällen freigeben sollte.const char * abc; TCHAR szName[256]; DWORD dwSize; CInternetSession session; CInternetFile* file = NULL;
Es handelt sich um Funktionen, die via Timer aufgerufen werden und vermutlich
immer wieder für Variablen Speicher belegen, aber ich ihn gar nicht wieder frei gebe.Wann nimmt man z.B. delete var; und wann macht man es anders, bzw. wie richtig?
-
Diese Informationen findest du in jedem guten Buch. Falls du noch keines hast schau mal in die C++ FAQ, dort findest du einige Buechervorschlaege.
-
Ich habe inzwischen einiges gelesen und denke so ist es richtig:
const char * abc;
delete abc;
TCHAR szName[256];
delete [] szName;
DWORD dwSize;
**
muss nicht freigegeben werden**CInternetSession session;
session.close();
CInternetFile* file = NULL;
file->Close();
delete file;Ein Buch ist ja schon auf dem Weg
Wäre aber schön, wenn mir jemand bestätigen
könnte, dass ich es wie oben geschrieben so auch richtig umsetze/ lerne.
-
...
-
Ich meinte, dass eigentlich nur ein Timer läuft und innerhalb dessen verschiedene
Funktionen aufgerufen werden in denen ich z.B. die genannten Variablen drin habe.Irgendwo ist dort das Problem vergraben. Ich schau jetzt erstmal alles genau durch
-
Die Speicherfreigabe von Objekten werden nicht direkt gemacht sondern in der idle time des Programmes, also wenn du nix mit new oder alloc reserviert hast dann brauchst dui auch nichts frei zu geben. Um jetzt zu schauen ob man immerhalb einer Routine nen speicherfresser hat gibt es eine Klasse die so was überwachen kann was CMemoryState ist.
-
CTecS schrieb:
Die Speicherfreigabe von Objekten werden nicht direkt gemacht sondern in der idle time des Programmes
Wir reden hier schon über C++?
-
...
-
oh scheinen ja nur spezialisten am werk zu sein wer hier schreibt
"Wir reden hier schon über C++?"
und
"kacke"
haben sicher den totalen durchblick, gut das es dem fragesteller jetzt auch die entsprechende antwort gegeen hat, prima wie ihr helft, wenn ihr dann noch was sinnvolles beitragen könnt dann bitte schreibt das auch, wenn das der in halt des forums ist bin ich der erste der sich hier abmeldet, weil dumme kommentare kann ich auch wo anders lesen
-
...
-
Was passiert eigentlich genau, wenn ich eine Membervariable für eine Klasse
mit CInternetSession* xy; anlege und am Ende einer Funktion delete xy; aufrufe.Wenn ich die Funtion in einem Timer habe, die von xy gebrauch macht,
wird dann beim nächsten Timer-Sufruf xy wieder erzeugt, oder ist es durch das delete komplett zerstört?
-
@CTecS
Dein Beitrag ist ziemlich sinnlos.
Ja, es gibt Objekte die die MFC im Idle-Loop wegräumt. Diverse temporäre CWnd Objekte o.ä. sind hier aber vollkommen uninteressant.Die Aussage von dir ist hier einfach verwirrend und vor allem vollkommen unnötig. Um zu entscheiden ob man ein Objekt löschen muss oder nicht, muss man das nicht wissen. Man muss einfach nur gucken wo man das Ding herbekommen hat. In der Doku steht dann normalerweise wem das Objekt gehört (wer es freigibt).
CTecS schrieb:
wenn das der in halt des forums ist bin ich der erste der sich hier abmeldet
Dann mal los.
Wobei du nach > 800 Beiträgen eigentlich ganz gut wissen solltest wie es hier zugeht.
-
Mallox schrieb:
Was passiert eigentlich genau, wenn ich eine Membervariable für eine Klasse
mit CInternetSession* xy; anlege und am Ende einer Funktion delete xy; aufrufe.Wenn ich die Funtion in einem Timer habe, die von xy gebrauch macht,
wird dann beim nächsten Timer-Sufruf xy wieder erzeugt, oder ist es durch das delete komplett zerstört?Wenn Du nur eine Membervariable hast, wird hier gar nichts allokiert.
Wenn Du delete aufrufst dann muss vorher mit new auch was allokiert worden sein oder der Zeiger muss 0 (NULL) sein.Allokiert wird gar nichts, außer Du machst ein new..., und zerstört wird auch nichts bis zu selbst ein delete ausführst.
-
@HustBaer: da muss man aber auch mal dazu sagen, dass es nicht die feine Art ist, anderer Leute Kommentar mit "Müll" oder "Kacke" zu kommentieren.
Man hätte auch einfach schreiben können, dass das gesagte schlichtweg FALSCH ist und dann mal noch drei Worte schreiben können, warum das so ist. In etwa so wie du das formuliert hast.
Zum Thema ist ja eigentlich alles gesagt.