En el C real ++ estándar, creando colecciones que satisfacen reglas siguientes es difícil si no imposible:unique_ptr - ¿mejoría importante?
- seguridad excepción,
- operaciones de vuelos internos (en contenedores STL reales: las operaciones son copias),
- automática gestión de la memoria.
Para satisfacer (1), una colección no puede almacenar punteros sin procesar. Para satisfacer (2), una colección debe almacenar punteros sin procesar. Para satisfacer (3), una colección debe almacenar objetos por valor.
Conclusión: los tres elementos entran en conflicto entre sí.
El artículo (2) no se cumplirá cuando se usen shared_ptr
s porque cuando una colección tendrá que mover un elemento, tendrá que hacer dos llamadas: a un constructor y a un destructor. No es posible realizar operaciones de copia/movimiento masivas, memcpy()
.
¿Es correcto que el problema descrito se resuelva por unique_ptr
y std::move()
? Colecciones que utilizan las herramientas serán capaces de satisfacer todas las 3 condiciones:
- Cuando se elimina una colección como un efecto secundario de una excepción, se llamará destructores
unique_ptr
's. Sin pérdida de memoria -
unique_ptr
no necesita ningún espacio adicional para el contador de referencia; por lo tanto, su cuerpo debe ser exactamente el mismo tamaño, como puntero envuelto,- No estoy seguro, pero parece que esto permite mover grupos de
unique_ptrs
utilizandomemmove()
operaciones similares (?), - incluso si es no es posible, el operador
std::move()
permitirá mover cada objetounique_ptr
sin realizar las llamadas de par constructor/destructor.
unique_ptr
tendrán la propiedad exclusiva de la memoria dada. No habrá pérdidas de memoria accidentales.
¿Es esto verdad? ¿Cuáles son otras ventajas de usar unique_ptr
?
Si yopu desea escribir un blog, siéntase libre de hacerlo, pero no aquí. –
@Neil: Esta es una pregunta concreta, el problema es que tuve que incluir muchos antecedentes. Es * útil *, por ejemplo, la respuesta de James Hopkin, que las operaciones de Memcopy() no se incluyeron en el borrador. ¿Cómo más se suponía que iba a preguntar sobre eso? Sin el fondo? ¡Nadie lo entendería! –
Quizás se hubiera preguntado mejor como '¿Cuáles son las ventajas de unique_ptr'. Siempre puedes responder tu propia pregunta. –