Ein Speicherleck ist eine Art der Programmierung Fehler, wenn ein Programm weist mehr Speicher als es befreit auftritt. Auf diese Weise kann eine Anwendung über genügend Arbeitsspeicher ausgeführt und das System zum Absturz bringen. Um Speicherlecks zu verhindern, müssen Sie wissen, wann sie am häufigsten auftreten und gewissenhaft mit der Nutzung der "neuen " und " delete" C + +-Operatoren . Things You
Proficiency in brauchen C + +
C + +-Compiler
Debugger und andere investigative Softwaretools
anzeigen Weitere Anweisungen
1
Verstehen Sie die Grundlagen Betreiber . Die C + +-Operator "new" Heap-Speicher zuweist . Die "delete "-Operator befreit Heap-Speicher . Für jede " neue ", sollten Sie einen "löschen" verwenden, so dass Sie den gleichen Speicher, den Sie kostenlos zugeteilt : . Char * str = new char [ 30] ; //Weisen 30 Byte , um eine Zeichenfolge haus
delete [] str; //löschen diese 30 Bytes und machen str Punkt nirgends
2
Umverteilung Speicher nur, wenn Sie gelöscht haben . . In dem folgenden Code , str erwirbt eine neue Adresse mit der zweiten Zuteilung . Die erste Adresse ist unwiederbringlich verloren, und so sind die 30 Byte , dass sie spitz. Jetzt sind sie unmöglich, kostenlos, und Sie haben einen Speicherverlust : . Char * str = new char [ 30] ; //str Geben Sie eine Speicheradresse Twitter //delete [] str; //Entfernen Sie den ersten Kommentar Markierung in dieser Linie zu korrigieren
str = new char [ 60 ] ; /.. /str Gib anderen Speicher -Adresse mit dem ersten immer verschwunden
delete [] str; //Dies löscht die 60 Bytes , nicht nur die ersten 30 .
3
beobachten diese Zeiger -Zuweisungen . Jede dynamische Variable ( zugewiesenen Speicher auf dem Heap ) muss mit einem Zeiger verbunden sein. Wenn eine dynamische Variable losgelöst von seinen Zeiger (n) wird , wird es unmöglich, zu löschen. Auch hier ergibt sich ein Memory Leak : char * str1 = new char [ 30] ;
char * str2 = new char [ 40 ] ;
strcpy ( str1 , " Memory Leak " ) ;
str2 str1 = //Bad ! Jetzt sind die 40 Bytes sind unmöglich zu
delete [] str2 ; . //Dadurch werden die 30 Byte
delete [] str1 ; . //Mögliche Zugriffsverletzung . Was für eine Katastrophe !
4
Seien Sie mit lokalen Zeiger vorsichtig. Ein Zeiger Sie in einer Funktion deklarieren wird auf dem Stapel reserviert , aber die dynamische Variable er zeigt auf dem Heap . Wenn Sie nicht löschen , wird es nach dem Programm aus der Funktion bestehen : nichtig Leak (int x ) {
char * p = new char [ x] ; Twitter //delete [] p; . //Entfernen Sie den ersten Kommentar Kennzeichnung zu korrigieren
}
5
Achten Sie auf die eckigen Klammern nach " zu löschen. " Verwenden Sie " Löschen" von selbst um ein einzelnes Objekt zu befreien. Verwenden Sie " löschen " [] mit eckigen Klammern , um einen Heap- Array zu befreien. Tun Sie das nicht etwas wie dieses: char * eins = new char ;
delete [] ein ; //Falsche
char * = new char viele [30] ;
löschen viele ; ! //Falsche