push_front into cplusplus c++ emplace exception-safety

into - vector c++



¿Es seguro usar emplace_back con un contenedor de unique_ptrs? (1)

Considera lo siguiente:

std::vector<std::unique_ptr<int>> ptrsToInts; ptrsToInts.emplace_back(new int);

Si la reasignación ocurre en el vector, y eso falla (lanzar std::bad_alloc ), ¿estoy "seguro" o std::bad_alloc un int ?

C ++ 11 23.3.6.5 [vector.modifiers] / 1 dice:

Si se produce una excepción distinta a la del constructor de copia, mueva el constructor, el operador de asignación o el operador de asignación de movimiento de T o mediante cualquier operación InputIterator , no hay efectos.

lo que parece indicar que este es un problema potencial. Es decir, si no hay "efectos", entonces nunca se construyó unique_ptr , y por lo tanto, el comportamiento del destructor en el que se confiaría para delete ese puntero no se produciría. (Lo que podría indicar que emplace_back debería estar prohibido para contenedores de unique_ptr s)


Si se requiere una reasignación y falla, entonces sí, su objeto nunca entró en el contenedor y, por lo tanto, se perderá.

Sin embargo, debe tenerse en cuenta que se trata de un error de usuario puro. emplace_back no debe estar "prohibido" para los contenedores de unique_ptr , porque existen formas perfectamente seguras de hacerlo (como reserve el espacio de antemano, para que sepa que siempre estará allí). Además, puede pasar todo el unique_ptr s, ya que es perfectamente capaz de usar un constructor de movimientos.

Entonces, realmente, es tu culpa por no envolver correctamente tu objeto no RAII (el int* ) en un objeto RAII antes del punto en el que podrías lanzar excepciones.