Comment et quand faire des copies complètes en C ++

Les classes qui attribuent des ressources de leur constructeur devraient normalement inclure un constructeur de copie pour créer des copies de ces ressources. L'attribution d'un nouveau bloc de mémoire et copier le contenu de l'original dans ce nouveau bloc est connu comme la création d'un copie en profondeur (par opposition à la copie superficielle par défaut). Utilisez les étapes suivantes pour déterminer quand et comment faire des copies profondes en C ++:

  1. Toujours faire une copie en profondeur si le constructeur alloue les ressources.

    Par défaut, C ++ fait soi-disant copies "peu profondes" Membre par membre d'objets lors de leur passage à des fonctions ou à la suite d'une cession. Vous devez remplacer les opérateurs de copie superficielle par défaut avec leur équivalent copie en profondeur pour toute classe qui alloue des ressources dans le constructeur. La ressource la plus commune qui obtient alloué est mémoire de tas qui est renvoyée par le nouvel exploitant.

  2. Toujours inclure un destructeur pour une classe qui alloue les ressources.

    Si vous créez un constructeur qui alloue les ressources, vous devez créer un destructeur qui les restaure. Aucune exception.

  3. Toujours déclarer le destructeur virtuel.

    Une erreur débutant commune est d'oublier de déclarer votre destructeur virtuel. Le programme se déroulera bien jusqu'à un programmeur méfiance arrive et hérite de votre classe. Le programme semble toujours travailler, mais parce que le destructeur de la classe de base ne peut être invoqué correctement, des fuites de mémoire de votre programme comme une passoire jusqu'à ce qu'il se bloque finalement. Ce problème est difficile à trouver.

  4. Toujours inclure un constructeur de copie pour une classe qui alloue les ressources.

    Le constructeur de copie crée une copie correcte de l'objet courant par l'allocation de mémoire hors du tas et copier le contenu de l'objet source.

  5. Toujours remplacer l'opérateur d'affectation pour une classe qui alloue les ressources.

    Les programmeurs devraient être dissuadés de les opérateurs primordiales, mais l'opérateur d'affectation est une exception. Vous devez remplacer l'opérateur d'affectation pour toute classe qui alloue des ressources dans le constructeur.

    L'opérateur d'affectation devrait faire trois choses:

  1. Assurez-vous que l'objet de la main gauche et à droite ne sont pas le même objet. En d'autres termes, être sûr que le programmeur d'application n'a pas écrit quelque chose comme (A = A). Si elles sont, ne rien faire.

  2. Appelez le même code que le destructeur de l'objet de la main gauche pour revenir ses ressources.

  3. Appelez le même code comme un constructeur de copie pour faire une copie profonde de l'objet de la main droite dans l'objet de la main gauche.

  • Si vous ne pouvez pas faire cela, alors supprimer le constructeur de copie et de l'opérateur d'affectation de sorte que le programme ne peut pas faire des copies de votre objet.

  • Si vous ne pouvez même pas le faire parce que votre compilateur ne supporte pas la fonction de suppression constructeur C ++ 2011, créer un constructeur de copie et d'affectation vide et de déclarer les protégeait de garder d'autres classes de leur utilisation.


  • » » » » Comment et quand faire des copies complètes en C ++