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

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-28 06:30:301056parcourir

 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>

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>

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!

Déclaration:
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