En minnesläcka är en typ av programmering bugg som inträffar när ett program allokerar mer minne än det frigör . På så sätt kan en applikation få slut på minne och orsaka att systemet kraschar . För att förhindra minnesläckor , måste du veta när de inträffar oftast och vara samvetsgrann med din användning av " nya " och " Delete" C + + operatörer . Saker du behöver
Kunskaper i C + + Review C + + kompilator
Debugger och andra undersökande verktyg programvara
Visa fler instruktioner
1
förstå verksamhetsutövarens grunderna . Den C + + operatör " ny " allokerar heap minne . Den " delete " operatör frigör heap minne . För varje " ny ", bör du använda ett " delete " så att du frigöra samma minne du tilldelas : .
Char * str = new char [ 30 ] , //Tilldela 30 bytes för att hysa en sträng
delete [ ] Str , //Rensa dessa 30 byte och göra Str punkt ingenstans Addera 2
Omfördela minnet endast om du har tagit bort . . I koden nedan , str förvärvar en ny adress med den andra fördelningen . Den första adressen är förlorat oåterkalleligt , och så är de 30 byte som den pekade på . Nu är de omöjliga att fria , och du har en minnesläcka : .
Char * str = new char [ 30 ] , //Ge str en minnesadress Twitter //delete [ ] Str ; //Ta bort den första kommentaren märkning i denna linje för att korrigera
str = new char [ 60 ] , . . //Ge str annan minnesadress med den första borta för alltid
delete [ ] str , //detta raderar den 60 bytes , inte bara den första 30 .
3
Titta dessa pekare uppdrag . Varje dynamisk variabel ( allokerat minne på heap ) behöver associeras med en pekare . När en dynamisk variabel blir skiljas från sin pekare ( s ) , blir det omöjligt att radera . Återigen , detta resulterar i en minnesläcka :
char * str1 = new char [ 30 ] ,
char * str2 = new char [ 40 ] ,
strcpy ( str1 , " Memory läcka " ) ;
str2 = str1 , //Bad ! Nu 40 bytes är omöjliga att fria
delete [ ] str2 , . //Detta raderar den 30 bytes
delete [ ] str1 , . //Möjlig tillgång kränkning . Vilken katastrof !
4
Var försiktig med lokala pekare . En pekare du deklarera en funktion fördelas på stacken , men den dynamiska variabeln den pekar fördelas på högen . Om du inte tar bort det , kommer det att finnas kvar efter programmet avslutas från funktionen :
void Leak ( int x ) {
char * p = new char [ x ] ; Twitter //delete [ ] p; . //ta bort den första kommentaren märkningen att korrigera
}
5
uppmärksam på hakparanteser efter " bort . " Använd " delete " i sig för att befria ett enda objekt . Använd " delete " [ ] med hakparenteser för att frigöra en heap array . Inte göra något sånt här :
char * en = ny char ,
delete [ ] en , //Fel
char * Många = new char [ 30 ] ,
bort många ; ! //Fel