Een geheugenlek is een soort programmering bug die optreedt wanneer een programma toewijst meer geheugen dan het bevrijdt . Op deze manier kan een toepassing opraken van het geheugen en zorgen dat het systeem crasht . Om het geheugen lekken te voorkomen , moet u het vaakst weten wanneer ze zich voordoen en worden nauwgezet met uw gebruik van de " nieuwe " en " delete " C + + operatoren . Wat je Vaardigheid in Need C + + C + + compiler Debugger en andere opsporingsdiensten software tools Toon Meer Aanwijzingen 1 Begrijp de exploitant basics . De C + + operator " nieuwe " toewijst heap geheugen . De " delete "-operator bevrijdt heap geheugen . Voor elke " nieuwe , ' je moet een " delete " te gebruiken , zodat u dezelfde geheugen toegewezen bevrijden : . Char * str = new char [ 30 ] ; //toewijzen 30 bytes naar een string te huisvesten < br > delete [ ] str ; //Clear die 30 bytes en maak str punt nergens 2 Herallocatie geheugen alleen als u hebt verwijderd . . In de onderstaande code , verwerft str een nieuw adres met de tweede toewijzing . Het eerste adres is onherroepelijk verloren , en dus zijn de 30 bytes dat het wees op . Nu zijn ze onmogelijk te vrij , en je hebt een geheugenlek : . Char * str = new char [ 30 ] ; //Geef str een geheugenadres Twitter //delete [ ] str ; //Verwijder de eerste reactie markering in deze lijn te corrigeren str = new char [ 60 ] ; . . //Give str ander geheugenadres met de eerste voorgoed verdwenen delete [ ] str ; //Hiermee wordt het 60 bytes , niet alleen de eerste 30 . 3 Let op die pointer opdrachten. Elke dynamische variabele ( toegewezen geheugen op de heap ) moet worden verbonden met een wijzer . Wanneer een dynamische variabele wordt losgekoppeld van de pointer ( s ) , wordt het onmogelijk om te wissen . Nogmaals, dit resulteert in een geheugenlek : char * str1 = new char [ 30 ] ; char * str2 = new char [ 40 ] ; strcpy ( str1 , "Memory lek " ) ; str2 = str1 ; //Bad ! Nu is het 40 bytes zijn onmogelijk te vrije beelden delete [ ] str2 ; . //Dit wist de 30 bytes delete [ ] str1 ; . //Mogelijke toegang overtreding . Wat een ramp ! 4 Wees voorzichtig met lokale pointers . Een pointer verklaart u in een functie wordt toegewezen op de stapel , maar de dynamische variabele het wijst op wordt toegewezen op de heap . Als je het niet verwijdert , zal het blijven bestaan nadat het programma verlaat de functie : leegte Leak ( int x ) { char * p = new char [ x ] ; Twitter //delete [ ] p ; . //verwijder de eerste reactie markering te corrigeren } 5 Let op de rechte haken na " verwijderen . " Gebruik " delete " op zichzelf om een enkel object te bevrijden . Gebruik de " delete " [ ] met vierkante haken op een hoopje matrix bevrijden . Doen iets niet doen als dit : char * een = new char ; delete [ ] een; //Wrong char * vele = new char [ 30 ] ; verwijderen vele ; ! //Wrong
|