Il me semble que nous pouvons appeler le destructeur de manière explicite dans ce cas, pourriez-vous m'expliquer pourquoi?
Parce que c'est permis par la langue pour être en mesure d'appeler le destructeur de n'importe quel objet chaque fois que vous voulez (en supposant que vous avez accès, par exemple, il n'est pas privé destructeur).
Ce qui est le cas pour ceux destructeur d'appel de dire dans cet exemple?
Il vient appelle le destructeur. Logiquement, cela signifie que l'objet est détruit et devraient être considérés comme des déchets à partir de ce moment et ne doit pas être déréférencé ou utilisé. Techniquement, cela signifie que l'objet est dans quel état le destructeur laisse au, qui, pour certains objets peuvent être identiques à défaut de construction (mais vous ne devez jamais compter sur qui).
Pourquoi sont-ils raisonnables?
Parfois, vous avez besoin pour détruire les objets sans relâcher leur mémoire. Ce qui se passe dans beaucoup de classe comme variante tout, diverses script de liaison et de réflexion, certains singleton implémentations, etc.
Par exemple, vous pouvez utiliser std::aligned_storage
d'allouer un tampon pour un objet, puis utilisez le placement de nouveaux de construire un objet dans la mémoire tampon. Vous ne pouvez pas appeler delete
sur cet objet depuis qui permettra à la fois d'appeler le destructeur et essayer de libérer de la mémoire de sauvegarde. Vous devez appeler explicitement le destructeur dans ce cas de bien détruire l'objet.
Quels sont les cas que nous pouvons appeler les destructeurs explicitement à part le placement supprimer?
Il n'y a pas une telle chose comme "placement supprimer", autre que celle d'un opérateur de placement de nouvelles (et tous les appels à des delete
sera implicitement appeler le destructeur à l'exception de ceux que le compilateur appelle de l'échec de la construction, par exemple, votre placement supprimer " notion).
Un exemple que j'ai donné ci-dessus. Un autre exemple est - std::vector
. Vous pouvez appeler des fonctions de membre comme pop_back()
. Ce besoin de détruire le dernier élément du vecteur, mais il ne peut pas utiliser delete
depuis la mémoire de sauvegarde de l'objet fait partie d'une plus grande mémoire tampon qui doivent être gérés séparément. Il en va de même pour de nombreux autres conteneurs, telles que l'ouverture d'adressage de tables de hachage, deque
, et ainsi de suite. Ceci est un exemple de l'endroit où vous voulez les utiliser l' template typename
afin d'appeler le destructeur de manière explicite.
C'est une fonctionnalité que l'utilisateur d'une bibliothèque est très rarement besoin mais le réalisateur d'une bibliothèque bas niveau comme le TSL, ou même certains cadres ont besoin d'utiliser ici et là.