Comment prévenir les fuites de mémoire dans c ++

<

Contenu

  • Instructions
  • Conseils & avertissements
  • ressources
  • div itemprop="description" class="intro marginTop" data-module="article-intro">

    Une fuite de mémoire est un type de bug de programmation qui se produit lorsqu`un programme alloue plus de mémoire qu`il libère. De cette façon, une application peut manquer de mémoire et causer un crash du système. Pour éviter les fuites de mémoire, vous devez savoir quand ils se produisent le plus souvent et être consciencieux avec votre utilisation du "Nouveau" et "effacer" Les opérateurs C de.

    Choses que vous devez

    • La maîtrise de C ++
    • le compilateur C de
    • Débogueur et d`autres outils logiciels d`investigation

    Instructions

    1. Comprendre les bases de l`opérateur. L`exploitant du C "Nouveau" alloue de la mémoire de tas. le "effacer" l`opérateur libère la mémoire de tas. Pour chaque "Nouveau," vous devez utiliser un "effacer" de sorte que vous libérez la même mémoire que vous avez alloué:

      char * str = new char [30] - // Allouer 30 octets pour abriter une chaîne.

      supprimer [] str- // Effacer les 30 octets et make str pointer nulle part.




    2. Redistribuer mémoire uniquement si vous avez supprimé. Dans le code ci-dessous, str acquiert une nouvelle adresse à la deuxième allocation. La première adresse est perdue irrémédiablement, et sont donc les 30 octets qu`il pointée. Maintenant, ils sont impossibles à libre, et vous avez une fuite de mémoire:

      char * str = new char [30] - // Donner str une adresse mémoire.

      // Delete [] str- // Retirez le premier marquage dans cette ligne pour corriger commentaire.

      str = new char [60] - // Donner str une autre adresse de mémoire avec le premier disparu à jamais.

      supprimer [] str- // Ceci supprime les 60 octets, et pas seulement les 30 premiers.

    3. Regardez les assignations de pointeur. Chaque variable dynamique (de mémoire allouée sur le tas) doit être associé à un pointeur. Lorsqu`une variable dynamique devient désolidarisé de son pointeur (s), il devient impossible d`effacer. Encore une fois, cela se traduit par une perte de mémoire:

      carboniser str1 = new char [30] -

      carboniser
      str2 = new char [40] -

      strcpy (str1, "Fuite de mémoire") -

      str2 = str1- // Bad! Maintenant, les 40 octets sont impossibles à libérer.

      supprimer [] str2- // Ceci supprime les 30 octets.

      supprimer [] str1- // Possible violation d`accès. Quel désastre!

    4. Soyez prudent avec les pointeurs locaux. Un pointeur vous déclarez dans une fonction est allouée sur la pile, mais la variable dynamique il pointe est alloué sur le tas. Si vous ne supprimez pas, il va persister après la fin du programme de la fonction:

      annuler fuite (int x) {

      char * p = new char [x] -

      // Delete [] p- // Retirez le premier marquage pour corriger un commentaire.

      }

    5. Faites attention aux crochets après "effacer." Utilisation "effacer" par lui-même pour libérer un objet unique. Utilisation "effacer" [] Avec des crochets pour libérer un tableau de tas. Ne pas faire quelque chose comme ceci:

      carboniser un = new char-

      supprimer [] de un // Mauvais

      carboniser
      nombre = new char [30] -

      supprimer plusieurs-// Faux!

    Conseils & Avertissements

    • Éviter de mélanger C et C ++. Utilisez de nouveau et supprimer, ou utilisez malloc () et free (). En aucun cas utiliser de nouveau avec free () ou malloc () avec suppression.

    Ressources

    AUTRES

    » » » » Comment prévenir les fuites de mémoire dans c ++