Maison > développement back-end > C++ > le corps du texte

Les pointeurs doivent-ils être définis sur NULL dans les destructeurs ? Un regard sur les meilleures pratiques et le débogage.

Patricia Arquette
Libérer: 2024-10-28 06:30:30
original
1055 Les gens l'ont consulté

 Should Pointers Be Set to NULL in Destructors? A Look at Best Practices and Debugging.

Définition de pointeurs sur NULL dans un destructeur

Dans la programmation orientée objet, il est courant d'allouer de la mémoire de manière dynamique et de la libérer à l'aide de destructeurs. Considérons la classe suivante qui alloue de la mémoire pour un objet de type Bar :

<code class="cpp">class Foo
{
public:
  Foo() : bar(new Bar)
  {
  }

  ~Foo()
  {
    delete bar;
  }

  void doSomething()
  {
    bar->doSomething();
  }

private:
  Bar* bar;
};</code>
Copier après la connexion

La question se pose : est-il avantageux de définir le pointeur de la barre sur NULL dans le destructeur ?

Argument contre la définition de NULL

Contrairement à la croyance populaire, définir des pointeurs sur NULL dans le destructeur n'est pas recommandé. Bien que cela puisse sembler une bonne idée à des fins de débogage, cela pourrait potentiellement entraîner des problèmes cachés dans les versions.

Si le pointeur est défini sur NULL, une référence pendante à l'objet supprimé peut exister quelque part. Dans une version de débogage, cette référence serait détectée et déclencherait un crash diagnosticable. Cependant, dans une version release, le code bogué peut éviter d'utiliser le pointeur car il remarque qu'il est NULL, obscurcissant ainsi le problème sous-jacent.

Approche alternative

Au lieu de En définissant le pointeur sur NULL, une meilleure pratique consiste à le définir sur une mauvaise valeur de pointeur connue. De cette façon, toutes les références en suspens à l'objet supprimé tenteront toujours d'utiliser le pointeur, déclenchant un crash qui peut être plus facilement diagnostiqué et corrigé.

Par exemple, l'expression suivante pourrait être utilisée :

<code class="cpp">~Foo()
{
    delete bar;
    if (DEBUG) bar = (bar_type*)(long_ptr)(0xDEADBEEF);
}</code>
Copier après la connexion

Cette approche permet de détecter les bogues potentiels dans les versions de débogage tout en garantissant que les versions de version détectent et plantent sur des références en suspens.

Conclusion

Pendant ce temps peut sembler une bonne idée de définir des pointeurs sur NULL dans les destructeurs, cela peut masquer des problèmes potentiels dans les versions de version. Au lieu de cela, il est recommandé de définir des pointeurs vers une mauvaise valeur connue en mode débogage pour faciliter le diagnostic et le débogage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal