Maison >développement back-end >C++ >Comment std::shared_ptr fonctionne-t-il pour un nettoyage arbitraire à l'arrêt ?

Comment std::shared_ptr fonctionne-t-il pour un nettoyage arbitraire à l'arrêt ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 14:34:11495parcourir

How does std::shared_ptr<void> travailler pour un nettoyage arbitraire à l'arrêt ? 
fonctionne-t-il pour un nettoyage arbitraire à l'arrêt ? " />

Pourquoi std::shared_ptr fonctionne

Malgré les attentes, std::shared_ptr peut être utilisé pour effectuer un nettoyage arbitraire à l'arrêt, même en utilisant std::shared_ptr

Effacement de type

Lorsqu'un shared_ptr est créé, il encapsule le pointeur détenu. avec une fonction de suppression. Cette fonction appelle généralement delete mais peut être configurée différemment via le constructeur. Lors de la destruction du shared_ptr, le suppresseur stocké est invoqué, déclenchant le nettoyage de l'objet.

Pour comprendre l'effacement de type, considérons l'exemple simplifié suivant en utilisant std::function:

template 
void delete_deleter(void *p) {
    delete static_cast(p);
}

template 
class my_unique_ptr {
public:
    my_unique_ptr(T *p, void(*deleter)(void *p) = &delete_deleter) 
        : p(p), deleter(deleter) 
    {}

    ~my_unique_ptr() {
        deleter(p);
    }

private:
    T *p;
    void(*deleter)(void *);
};

int main() {
    my_unique_ptr p(new double);
}

Ici, my_unique_ptr Le destructeur est appelé pendant le nettoyage.

std::shared_ptr et Type Erasure

Les pointeurs partagés utilisent également l'effacement de type. Lors de la copie ou de la construction par défaut d'un shared_ptr à partir d'un autre, les informations du suppresseur sont conservées. Cela signifie qu'un shared_ptr construit à partir d'un shared_ptr conserve les connaissances nécessaires pour appeler le destructeur approprié, même lorsqu'il est converti en shared_ptr.

Selon la norme C, ce comportement est garanti. Les implémentations ne peuvent pas modifier les éléments internes de std::shared_ptr d'une manière qui interromprait cette fonctionnalité. Par conséquent, en utilisant std::shared_ptr car le nettoyage arbitraire est une technique légitime et 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