Malloc: woher weiß ich denn wieviel Speicher ich brauche/reservieren muss?
-
Es wurde zwar an verschiedenen Stellen Speicher reserviert, aber nicht wieder freiggeben, drum saugts den Speicher leer...
-
Mondmann schrieb:
Es wurde zwar an verschiedenen Stellen Speicher reserviert, aber nicht wieder freiggeben, drum saugts den Speicher leer...
denk' das nächste mal darüber nach, eine programmiersprache/umgebung mit eingebautem 'garbage collector' zu benutzen, C#, D, ...
-
Um das in vernünftiger Zeit zu lösen, brauchst du einen Debugger und einen erfahrenen Programmierer. Einen Anfänger dürfte das vor große Probleme stellen, fürchte ich. Welchen Compiler benutzt du?
-
Ich hatte vorhin ne Antwort geschrieben wo ist die nur hin?
Naja ganz Anfänger bin ich nicht, ich programmiere sonst in C/C++/STL/BOOST.
Da mache ich DLLs die dynamische Webseiten erzeugen.
Der Code spuckt nach einer heftigen Socket Kommunikation mit der Software einen HTML/CSS/Javascript COde aus der die Webseite darstellt.Da ich mich somit um Speicher keine großartigen Gedanken machen muss (string) habe ich "Anfänger" geschrieben, auch, da es doch eher eine Anfänger Frage ist.
Das alles mache ich mit dem VC++Express.
Klappt wunderbar, einen Ressourceeditor brauche ich eh nicht.Grüße Mondmann
-
Seltsam, meine Antwort von vorhin ist auch weg...
Also nochmal: Such in der MSDN nach einen Artikel mit dem Titel: "Detecting and Isolating Memory Leaks". Das ist die beste Methode, um mit Visual-C++ dieses Problem anzugehen.
-
2am schrieb:
Seltsam, meine Antwort von vorhin ist auch weg...
Also nochmal: Such in der MSDN nach einen Artikel mit dem Titel: "Detecting and Isolating Memory Leaks". Das ist die beste Methode, um mit Visual-C++ dieses Problem anzugehen.
Ja das kenne ich..nur funktionierts nicht immer..ich habe zb. zum Test mit Absicht einen Leak eingebaut...hats nicht erkannt...
-
Dass da ein Leak ist, erkennt er auf jeden Fall! Wenn nicht, bist du die Sache falsch angegangen - oder es gibt gar kein Leak.
Die entsprechende Stelle im Code kann er allerdings nur finden, wenn die Reihenfolge der Speicherbelegungen von Lauf 1 nach Lauf 2 identisch ist. Das musst du sicherstellen. Geht das nicht, wird's schwierig.
Teste mal dieses Programm:
#define CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> int main(int argc, char* argv[]) { int *p = new int; _CrtDumpMemoryLeaks(); return 0; }
Das sollte folgende Ausgabe im Debug-Lauf ([F5]) erzeugen (- im Output-Window, nicht auf der Konsole!):
Detected memory leaks! Dumping objects -> {48} normal block at 0x00354FB8, 4 bytes long. Data: < > CD CD CD CD Object dump complete.
Funktioniert, oder?
-
Funktioniert.
Den Leak den ich eingebaut habe, ist in einem anderen Modul.
D.h, ich habeja mehrere c++ Dateien und in einer Funktion in einer dieser wird der Leak nicht angezeigt.
In andern schon...
-
Wird das Modul auch sicher im Debug-Modus übersetzt?
Falls ja: Wird die Funktion auch aufgerufen?
Falls ja: Probier mal testweise die CRT statisch zu linken, und dann Clean > Rebuild All.
-
ich werde aus dem sizeof befehl nicht schlau...ich möchte eigentlech exackt genau genug speicher reservieren, scheitere aber schon dort, da mehr speicher reserviert wird als ich will...
char *ch = (char*)malloc(sizeof(char)*10+1); i = strlen(ch); memcpy(ch,"\0",sizeof(char)*10); u = strlen(ch);
i ist 24...meiner meinung nacht höchstens 23...wenn man sich im debug modus das res. von (sizeof(char)*10+1) ansieht ergiebt das 11, womit ich voll einverstanden bin.
mit memcpy versuche ich eigentlich den speicher zu "initialisieren"...klappt irgendwie auch, denn u ist dann 0.
wenn ich allerdings den ganzen speicher sprich "ch" in ein textfile schreibe steht da hinten dran noch schrott. das passiert allerdings auch nur wenn es mer als 3 zeichen sind...irgendwie hab ich das gefühl das der speicher verschoben wird, oder so was...wäre froh um eure hilfe...
gruess tom
-
malloc() liefert dir zwar den Speicher, initialisiert ihn aber nicht mit sinnvollen Werten (dafür kannst du calloc() verwenden). Und strlen() misst die Länge, indem es das erste \0 Byte hinter der gegebenen Position sucht - beim ersten Aufruf liegt das außerhalb des von dir bestellten Speichers, beim zweiten Aufruf gleich am Anfang des Blocks (weil du es mit dem memcpy() dort reingepackt hast).
PS: sizeof(char) ist per Definition gleich 1
-
memcpy(ch,"\0",sizeof(char)*10);
Das ist kritisch, denn memcpy() versucht 10 Bytes von "\0" zu lesen. "\0" ist aber nur ein Byte lang. memset() wäre hier angebracht.
memset(ch, 0, sizeof(char) * 10);
-
2am schrieb:
memcpy(ch,"\0",sizeof(char)*10);
Das ist kritisch, denn memcpy() versucht 10 Bytes von "\0" zu lesen. "\0" ist aber nur ein Byte lang. memset() wäre hier angebracht.
Zwei Byte - das angegebene \0 und der automatisch vom Compiler angehängte Null-Terminator. Aber trotzdem zu klein, so daß die übrigen 8 Byte mit Datenmüll gefüllt werden.
(sorry für's kl****)
-
CStoll schrieb:
2am schrieb:
memcpy(ch,"\0",sizeof(char)*10);
Das ist kritisch, denn memcpy() versucht 10 Bytes von "\0" zu lesen. "\0" ist aber nur ein Byte lang. memset() wäre hier angebracht.
Zwei Byte - das angegebene \0 und der automatisch vom Compiler angehängte Null-Terminator. Aber trotzdem zu klein, so daß die übrigen 8 Byte mit Datenmüll gefüllt werden.
Gut beobachtet.
-
ok jungx! dänk ju for juur hälp!=)
leider wird mein log file immer noch mit schrott gefühlt, wenn ich den speicher block hineinschreiben will.
file1 = fopen("c:/temp/ctestfile.log","a"); fwrite(ch,sizeof(char)*strlen(ch)-1,strlen(ch)-1,file1);
also wollte ich es jetzt so versuchen, dass nur wirklich die zeichen geschrieben werden, die auch im speicher vorhanden sind:
file1 = fopen("c:/temp/ctestfile.log","a"); while (ch[i] != '0'){ fwrite(ch[i],sizeof(char),1,file1); i++; }
so, hier gibts einen zugriffsfehler...ich weiss nicht wie ihr das seht, aber meiner meinung nach(obwohl die ja bis jetzt immer gnadenlos daneben war) füttere ich den fwrite befehl doch mit den richtigen daten...
-
'0' ist etwas anderes als '\0'.
-
Du schreibst len-1 Datensätze ala len-1 Byte, die ab 'ch' beginnen, also insgesamt len^2-2*len+1 Byte, von denen nur die ersten len Byte sinnvoll sind. Versuchs's mal mit:
fwrite(ch,strlen(ch)/*sizeof(char) kannst du weglassen*/,1,file1);
(oder mit fputs())