Maison >développement back-end >C++ >std::shared_ptr peut-il être utilisé pour un nettoyage fiable à l'arrêt ?

std::shared_ptr peut-il être utilisé pour un nettoyage fiable à l'arrêt ?

DDD
DDDoriginal
2024-11-03 08:03:30403parcourir

Can std::shared_ptr be used for reliable cleanup at shutdown?

std::shared_ptr : une fonctionnalité inattendue

std::shared_ptr, introduit dans C 11, fournit un moyen de gérer des objets alloués dynamiquement avec une propriété partagée. Cependant, un cas d'utilisation intrigant a émergé utilisant std::shared_ptr, où il est utilisé pour un nettoyage arbitraire à l'arrêt. Bien qu'apparemment contre-intuitive, cette technique soulève des questions fondamentales sur le comportement et la fiabilité de std::shared_ptr.

L'exemple de travail

Considérez l'extrait de code suivant :

<code class="cpp">#include <memory>
#include <vector>

class Test {
public:
  Test() { std::cout << "Test created" << std::endl; }
  ~Test() { std::cout << "Test destroyed" << std::endl; }
};

int main() {
  std::vector<std::shared_ptr<void>> v;
  {
    v.push_back(std::shared_ptr<Test>(new Test()));
  }
  return 0;
}</code>

Étonnamment, ce code affiche :

Test created
Test destroyed

Cela suggère que l'objet Test est détruit correctement même s'il est détenu par un std::shared_ptr.

Le mécanisme sous-jacent

std::shared_ptr fournit l'effacement de type, séparant le type de l'objet géré de l'implémentation. En interne, il stocke une fonction de suppression qui appelle le destructeur approprié en fonction du type de l'objet d'origine.

Lorsqu'un std::shared_ptr est copié dans un std::shared_ptr, la fonction de suppression reste intacte. Le suppresseur stocké est chargé d'appeler le destructeur de test dans notre exemple.

Conformité et fiabilité standard

Bien que le comportement décrit fonctionne actuellement, il repose sur les détails d'implémentation et est non garanti par la norme C. Cela est dû à deux raisons :

  • Effacement de type : Le découplage du type interne de shared_ptr peut conduire à un comportement inattendu si l'implémentation change à l'avenir.
  • Fonction de suppression : L'implémentation de std::shared_ptr n'est pas obligée d'implémenter une fonction de suppression pour void*.

Par conséquent, l'utilisation de std::shared_ptr un nettoyage arbitraire peut être une pratique risquée et n'est pas recommandé pour un code fiable.

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