Hvordan finne en minnelekkasje i en C ++ -kode/prosjekt

Hvordan finne en minnelekkasje i en C ++ -kode/prosjekt
EN hukommelsestap I en C ++ kode eller prosjekt oppstår når et program hevder mer minne enn det trenger og ikke klarer å frigjøre det ekstra minnet tilbake til operativsystemet. Minnelekkasjer kan presentere i form av et applikasjon som uventet går tom for minne og krasjer eller har en alvorlig ytelsesforskjell mellom to påfølgende løp. Dette problemet kan forårsake en kritisk systemfeil i en C ++ -kode eller prosjekt og bør feilsøkes så snart som mulig.

Denne artikkelen vil diskutere hva en hukommelsestap er og gi en detaljert beskrivelse av hvordan du finner Minnelekkasjer I en C ++ -kode eller prosjekt.

Hva er en minnelekkasje

Et datamaskinproblem som kalles en hukommelsestap fører til at hukommelsen blir tildelt og frigjort feil. Når minnet i et program ikke lenger brukes av programmet, bør minnet frigjøres til operativsystemet, noe som gir effektiv bruk av alt tilgjengelig minne på et system. Men når et program ikke klarer å frigjøre det tildelte minnet og fortsetter å få tilgang til det etter at nytten er servert, Minnelekkasjer kan oppstå. Dette kan føre til at minnet blir konsumert eller 'lekket'Inntil systemet går tom for gratis minne og programmet krasjer. Siden alle systemer har en begrenset mengde minne og fordi minnet er dyrt, vil et programs minneutnyttelse øke hvis det inneholder Minnelekkasjer. Dermed vil det forårsake problemer.

Hvordan finne minnelekkasjer i en C ++ -kode eller prosjekt?

Det er noen grunnleggende måter du kan bruke til å oppdage minnelekkasjer i en C ++ -kode.

1: Sjekk for det grunnleggende om operatørene

Kjenn grunnleggende for operatører. Ny operatør tildeler et minneminne. Heapminnet frigjøres ved hjelp av slettoperatøren. For å frigjøre det samme minnet som ble tildelt, må du gjøre en sletting etter hver ny, ellers er det en sjanse for hukommelsestap.

2: Omfordel først etter sletting

Omfordel et minne først etter at du har slettet den første tildelingen. Hvis en variabel får en ny adresse for en annen tildeling, går den første adressen og bytene knyttet til den permanent tapt, noe som resulterer i hukommelsestap.

3: Sjekk for de tildelte pekerne

Observer de tildelte pekerne. Hver dynamiske variabel (minne tildelt på haugen) må være koblet til en peker. Det er vanskelig å slette en dynamisk variabel etter at den skiller seg fra pekeren (e). Nok en gang forårsaker dette en hukommelsestap.

4: Sjekk for de lokale pekerne

Bruk lokale pekere nøye. Når du definerer en peker i en funksjon, blir den dynamiske variabelen den peker på tildelt på haugen, ikke stabelen. Det vil forbli hvis du ikke fjerner det selv etter at programmet er ferdig med å forårsake Minnelekkasjer.

5: Bruk firkantede parenteser etter sletting nøye

Legg merke til de firkantede parentesene som følger "slett“. For å frigjøre et enkelt element, bruk slett av seg selv. For å frigjøre en heap -matrise, bruk slett [] vedlagt i firkantede parenteser.

Hvordan unngå minnelekkasjer?

  • Der det er mulig, kan du prøve å bruke smarte pekere i stedet for manuelt å håndtere minne.
  • Erstatning std :: streng for char *. STD :: String-klassen, som er rask og godt optimalisert, administrerer all minnestyring inne.
  • Bruk aldri en rå peker med mindre du trenger å koble deg til et utdatert bibliotek.
  • Ingen eller et lite antall nye/slette anrop i programmet er den mest enkle metoden for å forhindre Minnelekkasjer i c++. Ethvert krav til dynamisk minne burde skjules inne i et RAII -objekt som frigjør minnet ved avkjørsel. RAII garanterer at minnet vil bli behandlet når en variabel går ut av det nåværende omfanget ved å tildele minne i konstruktøren og slippe det i destruktøren.
  • Skriv all kode mellom de nye og slett nøkkelordene som brukes til å tildele og dele ut minne.

Program for å unngå minnelekkasjer

For eksempel:

#inkludere
#inkludere
ved hjelp av navneområdet STD;
void func_to_handle_mem_leak ()

int* ptr = ny int (5);
cout<
int main ()

func_to_handle_mem_leak ();
retur 0;

De peker I ovennevnte program blir ikke slettet etter tildelingen. Dette forårsaker hukommelsestap I ovennevnte C ++ -kode.

#inkludere
#inkludere
ved hjelp av navneområdet STD;
void func_to_handle_mem_leak ()

int* ptr = ny int (5);
cout<slett (ptr);

int main ()

func_to_handle_mem_leak ();
retur 0;

I denne koden sletter vi pekeren i den brukerdefinerte funksjonen derfor hukommelsestap unngås.

Produksjon

Konklusjon

Minnelekkasjer Innenfor et program kan ha skadelige resultater om programmet er lite eller stort. Å løse Minnelekkasjer, Statiske analyseverktøy, diagnostiske verktøy og feilsøkingsverktøy er integrerte i å finne og fikse problemet. Som sådan skal C ++ kode eller prosjekter regelmessig undersøkes og analyseres for å oppdage noen Minnelekkasjer, Ved hjelp av verktøyene og teknikkene ovenfor kan du dempe minnelekkasjene i en C ++ -kode.