Question

Nous savons tous que les pointeurs RAW doivent être enveloppés dans un type de pointeur intelligent pour obtenir la gestion de la mémoire en toute sécurité d'Exception. Mais en ce qui concerne les contenants de pointeurs, le problème devient plus épineux.

Les conteneurs std insistent sur le fait que l'objet contenu puisse être copié, ce qui exclut l'utilisation de std :: auto_ptr, même si vous pouvez toujours utiliser boost :: shared_ptr, etc.

Mais il existe également des conteneurs boost conçus explicitement pour contenir les pointeurs en toute sécurité:
Voir Bibliothèque de conteneurs Pointer .

La question est: Dans quelles conditions devrais-je préférer utiliser ptr_containers à un conteneur de smart_pointers?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
Était-ce utile?

La solution

Les conteneurs de pointeurs Boost ont une propriété stricte sur les ressources qu’ils détiennent. Un std :: vector & Lt; boost :: shared_ptr & Lt; X & Gt; & Gt; a la propriété partagée. Il y a des raisons pour que cela soit nécessaire, mais dans le cas contraire, je renforcerais par défaut: :: ptr_vector & Lt; X & Gt ;. YMMV.

Autres conseils

Restez à l'affût: les pointeurs intelligents sont une très bonne méthode de gestion de la gestion des ressources, mais pas la seule. Je conviens que vous verrez très peu de pointeurs bruts dans du code C ++ bien écrit, mais d'après mon expérience, vous ne voyez pas non plus autant de pointeurs intelligents. De nombreuses classes parfaitement adaptées aux exceptions sont mises en œuvre à l'aide de conteneurs de pointeurs bruts.

Eh bien, les frais généraux sont un cas.

Un vecteur de pointeurs partagés fera beaucoup de copies superflues impliquant la création d'un nouveau pointeur intelligent, l'incrémentation d'une référence, la décrémentation d'une référence, etc. sur un redimensionnement. Tout cela est évité avec un conteneur de pointeur.

Requiert le profilage pour garantir que les opérations de conteneur constituent le goulot d'étranglement:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top