Upptäcka läckor
Grunderna i memcheck.
Upptäcka läckor är en gratis lektion i C Academy på CoddyKit. Detta är lektion 2 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C Academy innehåller totalt 4 lektioner.
Vad en läcka är
En minnesläcka uppstår när du allokerar heapminne med malloc, calloc eller realloc och förlorar alla pekare till det innan du anropar free.
Blocket förblir reserverat men oåtkomligt tills processen avslutas. I program som körs länge ackumuleras läckor tills minnet tar slut.
En minimal läcka
Det här programmet läcker ett block på 40 byte.
Pekaren p är en lokal variabel. När main returnerar försvinner p, men heapblocket som den pekade på frigörs aldrig.
#include <stdlib.h>
int main(void) {
int *p = malloc(10 * sizeof(int));
p[0] = 1;
return 0; /* never free(p) */
}Köra memcheck
memcheck är standardverktyget, så du kan utelämna verktygsnamnet.
Lägg till --leak-check=full för att få en stackspårning för varje läckt allokering.
gcc -g -O0 -o leak leak.c
valgrind --leak-check=full ./leakLäcksammanfattningen
Vid avslutningen skriver Valgrind ut en LEAK SUMMARY. För programmet ovan ser den ungefär ut så här:
definitely lost: 40 bytes in 1 blocks
Spårningen pekar på den exakta platsen för anropet till malloc, så du vet precis vilken allokering som aldrig frigjordes.
De fyra läckkategorierna
memcheck delar in förlorat minne i fyra kategorier:
- definitely lost — ingen pekare finns kvar; en verklig läcka
- indirectly lost — kan bara nås via ett block som är definitely lost
- possibly lost — bara en pekare till blockets inre finns kvar
- still reachable — en pekare finns vid avslutningen, men du frigjorde den aldrig
Definitely lost jämfört med still reachable
definitely lost är den brådskande kategorin: dessa byte kan aldrig återställas medan programmet körs.
still reachable är mindre allvarlig. Blocket är läckt vid avslutningen, men en global eller statisk pekare refererar fortfarande till det. Det handlar därför oftast om en engångsallokering som du helt enkelt aldrig brydde dig om att frigöra.
Indirekta läckor
När du förlorar huvudet på en länkad struktur blir varje nod oåtkomlig.
Huvudet visas som definitely lost och resten som indirectly lost. Om du åtgärdar grundorsaken, det förlorade huvudet, återfår du allt.
struct Node { int v; struct Node *next; };
struct Node *make(void) {
struct Node *h = malloc(sizeof *h);
h->next = malloc(sizeof *h);
h->next->next = NULL;
return h;
}
/* if the caller drops the returned head, both nodes leak */Den korrigerade versionen
Frigör det du allokerar. Den här versionen läcker ingenting.
Under Valgrind rapporterar den All heap blocks were freed -- no leaks are possible.
#include <stdlib.h>
int main(void) {
int *p = malloc(10 * sizeof(int));
p[0] = 1;
free(p);
return 0;
}Räkna allokeringar
Även utan läckor visar HEAP SUMMARY hur mycket ditt program arbetade:
total heap usage: 1 allocs, 1 frees, 40 bytes allocated
När antalet allokeringar och frigörningar stämmer överens har du en ren körning. En avvikelse är din första ledtråd om att något har blivit kvar.
Visa nåbara block
Som standard listar memcheck inte still reachable-block i detalj. Lägg till följande om du även vill granska dem:
--show-leak-kinds=all
Detta tvingar fram en spårning för varje kategori och är användbart när du vill att ett program ska frigöra precis allt före avslutningen.
valgrind --leak-check=full --show-leak-kinds=all ./leakLäckor vid felhantering
De mest lömska läckorna gömmer sig på vägar med tidig retur. Här läcker det första blocket om den andra allokeringen misslyckas.
Vanlig testning träffar sällan dessa grenar, men memcheck upptäcker dem när kodvägen körs. Frigör alltid det du har kvar innan du returnerar vid ett fel.
char *a = malloc(100);
char *b = malloc(100);
if (!b) {
/* bug: a is leaked here */
return -1;
}
/* fix: free(a); before returning */Snabbtest
Välj den läckkategori som kräver mest omedelbar uppmärksamhet.
Sammanfattning
Nu kan du upptäcka läckor med memcheck:
- Kör
valgrind --leak-check=full ./progpå en binärfil kompilerad med-g - Läs LEAK SUMMARY och HEAP SUMMARY
- Prioritera definitely lost och spåra sedan indirekta läckor till deras rot
- Använd
--show-leak-kinds=allför att granska still-reachable-block
Härnäst: ogiltig minnesåtkomst.
Lär dig C med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 39
- Lektioner
- 144
Vanliga frågor
Är lektionen ”Upptäcka läckor” gratis?
Ja – hela texten till ”Upptäcka läckor” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Upptäcka läckor”?
Grunderna i memcheck. Ni övar på C Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C Academy?
Du behöver inga förkunskaper. Utbildningen i C Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Upptäcka läckor”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C Academy-lektionen?
Ja. Varje C Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Varför Valgrind
- Upptäcka läckor
- Ogiltig åtkomst
- Läsa rapporter