Steinbitglis Skrevet 22. august 2008 Del Skrevet 22. august 2008 (endret) Hei Jeg bare lurer på om følgende kodesnutt vil føre til minnelekasje. Er ikke helt stø på bruk av malloc :-s foo() { char* toBeExtended = "thisIsTheName"; extend(toBeExtended); std::cout << toBeExtended; } void extend(char*& lastPart) { char* completeName; completeName = (char*)( malloc(strlen(lastPart) + strlen("...") + 1) ); completeName[0] = ''; //konkatenerer fra høyre til venstre strcat(completeName, "..."); strcat(completeName, lastPart); lastPart = completeName; } Endret 22. august 2008 av Styggentorsken Lenke til kommentar
Dead_Rabbit Skrevet 22. august 2008 Del Skrevet 22. august 2008 (endret) Hvis jeg ikke tar helt feil, så blir det en minnelekkasje fordi du setter lastPart til å peke på completeName uten at lastPart slettes. Når du tilegner lastPart verdien av completeName, er det ikke noe som peker til minneområdet som lastPart pekte til, så du får en minnelekkasje. Endret 22. august 2008 av staalezh Lenke til kommentar
Steinbitglis Skrevet 22. august 2008 Forfatter Del Skrevet 22. august 2008 Fikk foreslått følgende, men jeg føler meg ikke helt trygg på den heller. Det er tydelig at jeg oppfinner hjulet på nytt her, i og med at jeg egentlig koder c++ ... Men er jo litt interessant å få klarhet i dette ... foo() { char* toBeExtended = "thisIsTheName"; extend(toBeExtended); std::cout << toBeExtended; free(toBeExtended); } void extend(char*& lastPart) { char* completeName; completeName = (char*)( malloc(strlen(lastPart) + strlen("...") + 1) ); completeName[0] = ''; //konkatenerer fra høyre til venstre strcat(completeName, "..."); strcat(completeName, lastPart); free(lastPart); lastPart = completeName; } Lenke til kommentar
Dead_Rabbit Skrevet 23. august 2008 Del Skrevet 23. august 2008 Hmm, jeg tror ikke det er nødvendig å kalle free på lastPart i extend allikevel, siden dette ikke er allokert på heapen. Det er imidlertid nødvendig å kalle free på toBeExtended i foo slik som du gjør nå. Lenke til kommentar
teflonpanne Skrevet 23. august 2008 Del Skrevet 23. august 2008 (endret) Det er en regel som sier "free what you malloc, delete what you new and delete[] what you new[]." Du trenger derfor ikke å gjøre free(lastPart), fordi lastPart aldri er malloc'a. Når du gjør char *foo="hei"; så dannes det en konstant stringliteral på stacken (det er derfor mer korrekt å skrive const char *foo=...) og du vil få en segmentation fault hvis du prøver å free'e det. Så staalezh har rett, du trenger ikke frigjøre lastPart, men toBeExtended. Hvis du bruker linux kan du bruke valgrind som sjekker om et program har memory leaks. Her er f.eks outputen med free(toBeExtended) og uten å free'e den, i den rekkefølgen: ... ==942== malloc/free: in use at exit: 0 bytes in 0 blocks. ==942== malloc/free: 1 allocs, 1 frees, 17 bytes allocated. ==942== ==942== All heap blocks were freed -- no leaks are possible. ... ... ==1129== malloc/free: in use at exit: 17 bytes in 1 blocks. ==1129== malloc/free: 1 allocs, 0 frees, 17 bytes allocated. ==1129== ==1129== searching for pointers to 1 not-freed blocks. ==1129== checked 109,164 bytes. ==1129== ==1129== LEAK SUMMARY: ==1129== definitely lost: 17 bytes in 1 blocks. ==1129== possibly lost: 0 bytes in 0 blocks. ==1129== still reachable: 0 bytes in 0 blocks. ==1129== suppressed: 0 bytes in 0 blocks. ... Endret 23. august 2008 av teflonpanne Lenke til kommentar
Steinbitglis Skrevet 27. august 2008 Forfatter Del Skrevet 27. august 2008 (endret) Dette kunne jeg sikkert slått opp selv, men siden vi er så godt i gang... Hvordan vet free hvor mye minne som skal frigjøres? Endret 27. august 2008 av Styggentorsken Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå