Rozważmy następujący:Czy można bezpiecznie używać emplace_back z kontenerem unique_ptrs?
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
Jeżeli występuje przesunięcie w wektorze, a które nie (rzucanie std::bad_alloc
), jestem „bezpieczne” lub będzie przeciekać się int
?
C++ 11 23.3.6.5 [vector.modifiers]/1 mówi:
razie zgłaszany jest wyjątek inny sposób niż przez konstruktora kopii przesunąć konstruktor operatorowi przeniesienia lub przejść operatora Przyporządkowanie
T
lub przez dowolną operacjęInputIterator
nie ma żadnych efektów.
co wydaje się wskazywać, że jest to potencjalny problem. Oznacza to, że jeśli istnieją "brak efektów", to nigdy nie skonstruowano żadnego unique_ptr
, a zatem zachowanie destruktora polegałoby na delete
, że wskaźnik nie wystąpiłby. (Co może oznaczać, że należy zablokować emplace_back
dla pojemników unique_ptr
s)
Dobra uwaga. To zainspirowało mnie do porzucenia mojego używania "nowego" całkowicie na rzecz 'std :: make_unique', dzięki czemu mogę wiedzieć, że każdy przydział kończy się na inteligentnym wskaźniku od początku. – GManNickG
Zauważyłem tę pułapkę w komentarzu tutaj: http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a-unique-ptr-into-a-vector/3283795#3283795 –