Malloc: woher weiß ich denn wieviel Speicher ich brauche/reservieren muss?
-
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())