Czy używanie emplace_back z kontenerem unique_ptrs jest bezpieczne?
Rozważ następujące:
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
Jeśli realokacja nastąpi w wektorze, a to się nie powiedzie (rzucaniestd::bad_alloc
), czy jestem „bezpieczny”, czy też wycieknęint
?
C ++ 11 23.3.6.5 [vector.modifiers] / 1 mówi:
Jeśli zostanie zgłoszony wyjątek inny niż konstruktor kopii, konstruktor ruchu, operator przypisania lub operator przypisania przeniesieniaT
lub dowolneInputIterator
operacja nie ma efektów.
co wydaje się wskazywać, że jest to potencjalny problem. To znaczy, jeśli są „brak efektów”, to nieunique_ptr
kiedykolwiek został skonstruowany, a zatem zachowanie destruktora, na którym można polegaćdelete
ten wskaźnik nie wystąpi. (Co może to wskazywaćemplace_back
należy zakazać pojemników zunique_ptr
s)