En minnelekkasje er en type programmering bug som oppstår når et program tildeler mer minne enn det frigjør . På denne måten kan en søknad går tom for minne , og føre til at systemet til å krasje . For å hindre minnelekkasjer , må du vite når de oppstår oftest og være pliktoppfyllende med din bruk av "nye" og "Slett" C + + operatører. Du trenger
Ferdigheter i C + + Online C + + kompilatoren
Debugger og andre undersøkende programvare verktøy
Vis flere instruksjoner
en
forstå operatør grunnleggende. The C + + operator " nye" tildeler heap minne. Den " delete " operatør frigjør heap minne. For hver "nye ", bør du bruke en " delete ", slik at du frigjøre det samme minnet du tildelt : .
Char * str = new char [ 30 ], //Fordele 30 byte for å huse en streng
delete [ ] str ; //Clear de 30 bytes og gjøre str poeng ingensteds
2
reallocate minnet bare hvis du har slettet. . I koden nedenfor , får str en ny adresse med andre tildeling. Den første adressen er tapt ugjenkallelig , og så er de 30 bytes som det pekt på . Nå er de umulig å fri , og du har en minnelekkasje : .
Char * str = new char [ 30 ], //Gi str et minne adresse Twitter //delete [ ] str ; //fjern den første kommentaren merking i denne linjen for å korrigere
str = new char [ 60] ; . . //Gi str annet minne adresse med det første borte for alltid
delete [ ] str ; //dette sletter 60 bytes , ikke bare de første 30 .
3
Sjekk disse pekeren oppdrag. Hver dynamisk variabel ( tildelte minnet på haugen ) må være forbundet med en peker . Når en dynamisk variabel blir disassociated fra dens spisser ( e) , blir det umulig å slette . Igjen , dette resulterer i en minnelekkasje :
char * str1 = new char [ 30 ];
char * str2 = new char [ 40 ];
strcpy ( str1 , "Memory lekkasje ") ;
str2 = str1 ; //Bad ! Nå 40 bytes er umulig å gratis nedlasting delete [ ] str2 ; . //Dette sletter de 30 bytes
delete [ ] str1 ; . //Mulig tilgang brudd . Hva en katastrofe !
4
Vær forsiktig med lokale pekere . En peker du erklære en funksjon fordeles på stakken , men dynamisk variabel den peker til fordeles på haugen. Hvis du ikke sletter den, vil det vedvare etter at programmet kommer ut av funksjon : en void Leak ( int x ) {
char * p = new char [ x ]; Twitter //delete [ ] p; . //Ta av første kommentar merking for å korrigere
}
5
Vær oppmerksom på firkant parenteser etter "slett ". Bruk " delete " av seg selv for å frigjøre ett enkelt objekt. Bruk " delete " [ ] med hakeparenteser for å frigjøre en haug array. Ikke gjør noe som dette : en char * en = new char ;
delete [ ] ett , //Feil
char * mange = new char [ 30 ];
slette mange ; ! //Feil