2011-01-29 35 views
6

Después de leer timdays answer-this question Tengo curiosidad acerca de la diferencia entre boost::ptr_container y una std::vector<shared_ptr>. Tenía la impresión de que a boost::ptr_container had ownership over the pointers given to it, y al momento de la liberación llamaría a los destructores de todos los punteros que contenía, independientemente de otras referencias a sus habitantes. ¿Qué es contrario al propósito de un std::vector<shared_ptr>, que después del lanzamiento solo lanzaría los punteros si el recuento de ref era 0?impulso :: ptr_container y std :: vector <shared_ptr>

Si este es el caso (supongo que no lo es), ¿por qué incluso el ejemplo de documentación Boost compare the two como si ellos son similares en propósito, y por qué se timday a responder a proponer un boost::ptr_container cuando es muy diferente a la finalidad de un std::vector<shared_ptr>.

Respuesta

7

Tienes razón, las dos son muy diferentes.

La primera diferencia, como habrás notado, es la semántica de propiedad. La propiedad de los elementos en un contenedor de puntero NO se comparte. En este sentido, un boost::ptr_vector<T> está mucho más cerca de un std::vector<std::unique_ptr<T>>.

¡Pero esta no es la única diferencia!

  • menos que se indique explícitamente en el tipo, un puntero de contenedores no contendrá ningún puntero nulo
  • un contenedor puntero tiene la semántica copia profunda (usando el método new_clone), y sólo se puede copiar si el objeto que sostiene es copiable
  • a Pointer Container tiene una semántica profunda const, es decir, si el contenedor es const, entonces no se puede mutar uno de sus elementos.

cuanto a por qué se sintió obligado @timday mencionar Boost puntero de contenedores, creo que es porque quería ampliar la pregunta un tanto. Boost Pointer Container se parecen mucho a Smart Pointers que pueden contener múltiples objetos y proporcionan una sintaxis más agradable que los contenedores de punteros en general.

En cuanto a su comparación con un std::vector< boost::shared_ptr<T> > Creo que es simplemente porque esta es la forma tradicional de la implementación de un vector de punteros en ausencia de la semántica de movimiento (sin unique_ptr) desde auto_ptr no puede ser utilizado en un contenedor STL. La gente simplemente no sabe acerca de los contenedores de punteros la mayor parte del tiempo ...

1

Existen situaciones en las que ambas pueden aplicarse: por ejemplo, un conjunto de funciones actúan como clientes del contenedor, sacando punteros a objetos polimórficos y realizando operaciones sobre ellos. Si el contenedor deja atrás todas las funciones, puede ser reemplazado por un contenedor de puntero.

Timday respondió la pregunta "¿Cuál es la diferencia entre el siguiente conjunto de punteros [s]" al señalar una omisión en la lista.

Cuestiones relacionadas