Considérez ce qui suit:Est-il prudent d'utiliser emplace_back avec un conteneur de unique_ptrs?
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
Si réallocation se produit dans le vecteur, et qui échoue (jeter std::bad_alloc
), je suis « sûr » ou vais-je fuir un int
?
C++ 11 23.3.6.5 [vector.modifiers]/1 dit:
Si une exception est levée autrement que par le constructeur de copier, déplacer constructeur, opérateur d'affectation, ou déplacer opérateur d'affectation de
T
ou par toute opérationInputIterator
il n'y a pas d'effets.
ce qui semble indiquer qu'il s'agit d'un problème potentiel. C'est-à-dire, s'il n'y a "aucun effet", alors aucun unique_ptr
n'a été construit, et par conséquent le comportement de destructeur sur lequel on compterait delete
ce pointeur ne se produirait pas. (Qui pourrait indiquer que emplace_back
devrait être interdit pour les conteneurs de unique_ptr
s)
Bon point. Cela m'a poussé à abandonner totalement l'utilisation de 'new' en faveur de' std :: make_unique', de sorte que je puisse savoir que chaque allocation se termine par un pointeur intelligent dès le départ. – GManNickG
J'ai noté cet écueil dans un commentaire ici: http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a-unique-ptr-into-a-vector/3283795#3283795 –