A hukommelsesfejl er en type programmering bug, der opstår, når et program allokerer mere hukommelse end den frigør . På denne måde kan et program løber tør for hukommelse og få systemet til at gå ned. For at forhindre memory leaks , du behøver at vide , når de forekommer hyppigst , og være samvittighedsfulde med din brug af den "nye" og "Slet" C + + operatører. Ting du skal
Færdigheder i C + + Online C + + compiler
Debugger og andre efterforskningsmæssige software værktøjer
Vis Flere Instruktioner
1
Forstå operatør basics. The C + + operatør " nye" allokerer bunke hukommelse. Den " delete " operatør frigør bunke hukommelse. For hver "nye ", skal du bruge en " delete ", så du frigøre den samme hukommelse, du tildelte : .
Char * str = new char [30 ] //afsætte 30 bytes til at huse en streng < br > delete [ ] str. //Clear de 30 bytes og gøre str punkt intetsteds
2
Omfordeling hukommelsen, hvis du har slettet . . I koden nedenfor, erhverver str en ny adresse med den anden tildeling. Den første adresse er tabt uigenkaldeligt , og så er de 30 bytes , at det pegede på . Nu er de umulige at gratis, og du har en hukommelsesfejl : .
Char * str = new char [30 ] //Give str en hukommelse adresse
//delete [ ] str ; //fjern den første kommentar mærkning i denne linje for at rette
str = new char [60 ] . . //Give str anden memory -adresse med den første væk for evigt
delete [ ] str. //dette sletter 60 bytes , ikke bare de første 30 .
3
Watch disse pointer opgaver. Hver dynamisk variabel ( allokerede hukommelse på heapen ) skal være forbundet med en pegepind . Når en dynamisk variabel bliver adskilles fra dets pointer (r) , bliver det umuligt at slette . Igen, dette resulterer i en hukommelsesfejl :
char * str1 = new char [ 30]
char * str2 = new char [40 ]
strcpy ( str1 , "Memory lækage " ) ,
str2 = str1 //Bad ! Nu de 40 bytes er umulige at gratis
delete [ ] str2 ; . //Dette sletter de 30 bytes
delete [ ] str1 , . //Eventuel adgang krænkelse . Hvad en katastrofe!
4
Vær forsigtig med lokale pointere. En pointer du erklærer en funktion fordeles på stakken , men den dynamiske variabel den peger på fordeles på bunke. Hvis du ikke sletter den, vil den fortsætter efter programmet afsluttes fra den funktion : Hej void Leak ( int x ) {
char * p = new char [x ]
//delete [ ] p ; . //fjern den første kommentar mærkningen på rette
}
5
Vær opmærksom på de firkantede parenteser efter "slet ". Brug " delete " af sig selv for at frigøre et enkelt objekt . Brug " delete" [ ] med firkantede parenteser for at befri en bunke array. Må ikke gøre noget som dette : Hej char * én = new char ,
delete [ ] one //Forkert
char * mange = new char [ 30]
slette mange ; ! //Forkert