C ++ std :: queue :: pop () appelle le destructeur. Qu'en est-il des types de pointeurs?
J'ai un std::queue
qui est enveloppé basé sur un modèle de classe de faire un thread-safe file d'attente. J'ai deux versions de cette classe: l'un qui stocke les types de valeur, celui qui stocke les types de pointeur.
Pour le type de pointeur, je vais avoir de la difficulté à supprimer les éléments de la file d'attente de destruction. La raison en est que je ne connais pas un moyen de supprimer les éléments de la file d'attente en toute sécurité.
Cette référence unis (vacuously, donc je suppose qu'il ne fait pas ÉTAT) que la seule façon de supprimer des éléments de la file d'attente est d'appeler pop()
. La référence dit aussi que pop()
appelle le destructeur de l'objet.
Bien, cela provoque des problèmes avec mon pointeur types parce qu'ils peuvent ou ne peuvent pas réellement de point d'agrégats. Si l'un d'entre eux les points d'un ensemble, ils seront tous, mais parce que l'emballage est basé sur un modèle, il n'ya aucune garantie que le type (agrégés ou non-agrégées), nous avons affaire avec.
Donc, quand pop()
appelle le destructeur, ce qui se passe? Comment puis-je m'assurer que tout est enlevé et la désallocation de la mémoire correctement?
Enfin, ma solution est d'utiliser une ancienne version de GCC pour ARM9. Je n'ai pas de contrôle là-dessus. Je comprends qu'il y a des bibliothèques qui ont des pointeurs intelligents et les conteneurs qui pourrait aider ici, mais ils sont hors-limites pour moi.
source d'informationauteur San Jacinto
Vous devez vous connecter pour publier un commentaire.
Sources en ligne sont la peine de ce que vous payez pour eux - obtenir une bonne référence comme Josuttis du livre. pop() n'est pas "appeler le destructeur" - il simplement supprime un élément de la file d'attente de l'adaptateur de représentation sous-jacente (par défaut, un std::deque) en appelant pop_front() sur celui-ci. Si la chose a sauté d'un destructeur, il sera utilisé lors de la sauté objet est hors de portée, mais la file d'attente de la classe n'a rien à faire avec elle.
Pointeurs eux-mêmes n'ont pas réellement de destructeurs, afin de l'appelant
pop()
sur une file d'attente contenant un pointeur de ne pas appeler le destructeur de l'objet de votre pointeur de points."Comment puis-je m'assurer que tout est enlevé et la désallocation de la mémoire correctement?"
Si vous absolument devez stocker des pointeurs dans votre file d'attente, et vous voulez être automatiquement libéré quand ils sont
pop
ed, alors, au lieu d'une file d'attente de pointeurs, vous avez besoin d'une file d'attente d'objets qui stocker un pointeur, et supprimer dans leur destructeur. Vous pouvez par exemple utiliser une file d'attente de shared_ptr. shared_ptr n'est pas dans la bibliothèque standard, mais ça fait partie de TR1 et est largement disponible.Sinon, il est de la responsabilité de l'appelant à la suppression de l'objet:
Le résumé est que les contenants de pointeurs vers les objets alloués dynamiquement sont un peu maladroit. Si vous pouvez concevoir votre programme de sorte que les conteneurs conserver des copies de vos objets, au lieu de pointeurs sur des objets dynamiques, puis le faire. A défaut, vous êtes responsable de la propriété de la ressource, pas le contenant. Des conteneurs STL ne sais rien au sujet de la propriété, ils suffit de copier et de détruire leur
value_type
. La copie et de détruire les pointeurs ne fait rien pour les objets qu'ils pointent.