C Academy · Lektion

Upptäcka läckor

Grunderna i memcheck.

Lektion 2 av 413 steg

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

Lä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 ./leak

Lä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 ./prog på 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=all för att granska still-reachable-block

Härnäst: ogiltig minnesåtkomst.

Gratis att börja

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

  1. Varför Valgrind
  2. Upptäcka läckor
  3. Ogiltig åtkomst
  4. Läsa rapporter
← Tillbaka till C Academy