Gå til innhold

Anbefalte innlegg

Skrevet (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 av Styggentorsken
Videoannonse
Annonse
Skrevet (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 av staalezh
Skrevet

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;
}

Skrevet

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å.

Skrevet (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 av teflonpanne
Skrevet (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 av Styggentorsken

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...