Hoe je geheugen lekken te voorkomen in C ++

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 de oorzaak van het systeem laten crashen.Het geheugen lekken te voorkomen, moet u weten wanneer ze komen het meest voor en zijn consciëntieus met uw gebruik van de "nieuwe" en "delete" C ++ exploitanten.

wat je

  • Proficiency nodig in C ++
  • C ++ compiler
  • debugger en andere opsporingsdiensten software tools

instructies

  1. Begrijp de operator basics.De C ++ exploitant "nieuwe" wijst heapgeheugen.De "delete" exploitant bevrijdt heap geheugen.Voor elke "nieuwe", moet u gebruik maken van een "delete", zodat je vrij hetzelfde geheugen toegewezen:

    char * str = new char [30];// Toewijzen 30 bytes naar een string te huisvesten.

    verwijderen [] str;// Clear die 30 bytes en maak str punt nergens.

  2. herverdelen geheugen alleen als u hebt verwijderd.In de onderstaande code, s

    tr krijgt een nieuw adres met de tweede toewijzing.Het eerste adres is onherroepelijk verloren, en zo zijn de 30 bytes dat hij wees op.Nu zijn ze onmogelijk te vrij, en je hebt een geheugenlek:

    char * str = new char [30];// Give str een geheugen adres.

    // verwijderen [str];// Verwijder de eerste opmerking markering in deze lijn te corrigeren.

    str = new char [60];// Give str ander geheugen adres met de eerste voorgoed verdwenen.

    verwijderen [] str;// Dit verwijdert de 60 bytes, en niet alleen de eerste 30.

  3. volgen 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), is het onmogelijk te wissen wordt.Nogmaals, dit resulteert in een geheugenlek:

    char str1 = new char [30];

    char
    str2 = new char [40];

    strcpy (str1, "Memory lek");

    str2 = str1;// Bad!Nu de 40 bytes zijn onmogelijk te bevrijden.

    verwijderen [] str2;// Dit wist de 30 bytes.

    verwijderen [] 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 dat verwijst naar wordt toegewezen op de heap.Als u niet verwijdert, zal het blijven bestaan ​​na het programma verlaat de functie:

    vervallen Leak (int x) {

    char * p = new char [x];

    // verwijderen [] p;// Verwijder de eerste opmerking markering te corrigeren.

    }

  5. Let op de rechte haken na "te verwijderen."Gebruik "verwijderen" door zich voor een enkel object te bevrijden.Gebruik "delete" [] met vierkante haken om een ​​hoop scala bevrijden.Heb zoiets als dit niet te doen:

    char één = new char;

    [] één te verwijderen;// Verkeerde

    char
    vele = new char [30];

    verwijderen veel;// Fout!

Tips & amp;Waarschuwingen

  • Vermijd het mengen van C en C ++.Gebruik nieuwe en verwijderen, of gebruik malloc () en gratis ().In geen geval nieuwe gebruiken met gratis () of malloc () met delete.

Resources

  • Cplusplus.com biedt complete C ++ tutorials.
  • Bruceeckel.com biedt twee online boeken in C ++.
  • De C / C ++ Users Journal heeft hulp voor C ++ ontwikkelaars.
753
0
1
C / C ++ Programming