2011-01-09 11 views
7

He estado buscando una forma de hacer vectores seguros y mapas de punteros dinámicos, cuando me di cuenta de que C++ 11 agrega unique_ptr s. Busqué cómo usarlos en Google, pero no pude buscar detalles. Lo que necesito saber son los siguientes:Uso de std :: unique_ptr con contenedores estándar

  1. ¿Qué, exactamente, es diferente entre los punteros y unique_ptr s además de recogida automática de la memoria?
  2. ¿Cómo hago para eliminar un unique_ptr de un vector o un mapa? ¿Hay algún código especial que deba usar además de borrar el iterador?
+1

¿Es unique_ptr una condición esencial? Si su propósito es la seguridad, std :: shared_ptr podría ser una alternativa. –

Respuesta

13
  1. Nada. Un unique_ptr es solo un contenedor alrededor de un puntero, que borra el puntero cuando se destruye el unique_ptr. No tiene sobrecarga (al igual que la plantilla auto_ptr a la que reemplaza).
  2. No, solo funcionará. La dificultad en realidad proviene de insertando el puntero en el vector o mapa - mientras que debe mover el unique_ptr en el contenedor.
+0

¡Gracias! No estaba muy seguro, y no pude encontrar mucho en Google, así que estoy contento de recibir una respuesta. – OniLink

+1

+1 para una buena explicación, aunque es posible que desee tener en cuenta que, como máximo, un unique_ptr puede apuntar a un recurso, mientras que un número ilimitado de punteros sin procesar puede apuntar a un recurso en particular. – templatetypedef

+2

+1, quizás agregando un ejemplo de inserción (especialmente uno que muestre por qué se requiere mover) ayudaría. –

4
  1. La diferencia es que unique_ptr obedece a mover la semántica. Además, como su nombre lo indica, no puedes hacer copias de él.

  2. Al borrar un elemento de std::vector<std::unique_ptr<T> > se eliminará efectivamente el puntero señalado.

+0

+1 para 2. - obvio cuando te enfocas en él, pero puede ser un problema durante la transición de punteros sin procesar a punteros inteligentes, si solo vas "a medio camino" con los punteros sin procesar que apuntan a la memoria liberada porque se eliminó un elemento – kfmfe04

Cuestiones relacionadas