Gå til innhold

Anbefalte innlegg

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 av Styggentorsken
Lenke til kommentar
Videoannonse
Annonse

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 av staalezh
Lenke til kommentar

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

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 av teflonpanne
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...