Hur kan man förhindra minnesläckor i C ++

August 1

En minnesläcka är en typ av programmering fel som uppstår när ett program allokerar mer minne än den frigör. På så sätt kan en applikation få slut på minne och leda till att systemet kraschar. För att förhindra minnesläckor, måste du veta när de uppstår oftast och vara samvetsgrann med din användning av "nya" och "delete" C ++ operatörer.

Instruktioner

1 Förstå operatörs grunderna. C ++ operatör "nya" allokerar stackminne. "Delete" operatör frigör heap minne. För varje "ny" bör du använda ett "ta bort" så att du frigöra samma minne du tilldelas:

char * str = new char [30]; // Tilldela 30 byte för att hysa en sträng.

radera [] str; // Noll dessa 30 byte och göra str punkt ingenstans.

2 Omfördela minne endast om du har tagit bort. I koden nedan förvärvar str en ny adress med andra tilldelningen. Den första adressen förloras oåterkalleligen, och så är de 30 bytes som det pekade på. Nu är de omöjliga att gratis och du har en minnesläcka:

char * str = new char [30]; // Give str en minnesadress.

// Radera [] str; // Ta den första kommentaren märkning i denna linje för att korrigera.

str = new char [60]; // Give str annan minnesadress med den första borta för alltid.

radera [] str; // Detta raderar 60 bytes, inte bara de första 30.

3 Titta på dessa pekar uppdrag. Varje dynamisk variabel (allokerat minne på högen) måste vara associerad med en pekare. När en dynamisk variabel blir skiljas från dess pekare (er), 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 frigöra.

radera [] str2; // Detta raderar 30 byte.

radera [] str1; // Möjligt åtkomstfel. Vad en katastrof!

4 Var försiktig med lokala pekare. En pekare du deklarerar i en funktion fördelas på stacken, men den dynamiska variabeln den pekar på allokeras på heap. 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];

// Radera [] p; // Ta den första kommentaren märkning att rätta till.

}

5 Var uppmärksam på de kvadratiska hängslen efter "ta bort". Använd "delete" i sig för att frigöra ett enda objekt. Använd "delete" [] med hakparenteser för att frigöra en hög rad. Gör inte så här:

char en = new char;

radera [] en; // Fel

röding många = new char [30];

ta bort många; // Fel!

Tips

  • Undvik att blanda C och C ++. Använd nya och ta bort, eller använda malloc () och gratis (). Under inga omständigheter använda ny med gratis () eller malloc () med delete.

        

Välkommen till dig för att skicka en kommentar:

            
            
            
            

© 2019 Astrixsoft.com | Contact us: webmaster# astrixsoft.com