2008-09-22 27 views
11

Todos sabemos que los punteros RAW deben estar envueltos en algún tipo de puntero inteligente para obtener la administración segura de excepciones de Exception. Pero cuando se trata de contenedores de punteros, el problema se vuelve más espinoso.Punteros y contenedores

El std contenedores insisten en el objeto contenido es copiable por lo que esto excluye el uso de std :: auto_ptr, aunque todavía se puede utilizar impulso :: shared_ptr etc.

Pero también hay algunos contenedores diseñados a impulsar de manera explícita para sostener con seguridad punteros:
Ver Pointer Container Library

La pregunta es: ¿en qué condiciones debería preferir utilizar los ptr_containers sobre un recipiente de smart_pointers?

boost::ptr_vector<X> 

or 

std::vector<boost::shared_ptr<X> > 

Respuesta

13

Boost tienen la propiedad estricto sobre los recursos que poseen. Un std :: vector < boost :: shared_ptr < X >> tiene propiedad compartida. Hay razones por las que puede ser necesario, pero en caso de que no lo sea, aumentaría automáticamente :: ptr_vector < X>. YMMV.

1

Bueno, sobrecarga es una caja.

Un vector de punteros compartidos hará una gran cantidad de copias extrañas que implican la creación de un nuevo puntero inteligente, el incremento de una referencia, la disminución de una referencia, etc. en un cambio de tamaño. Todo esto se evita con un contenedor de puntero.

Requiere perfiles para garantizar las operaciones de contenedores son el cuello de botella, aunque contenedores puntero :)

3

Steady on: los punteros inteligentes son un método muy bueno para manejar la administración de recursos, pero no el único. Estoy de acuerdo en que verá muy pocos punteros crudos en un código C++ bien escrito, pero en mi experiencia tampoco ve muchos punteros inteligentes. Hay muchas clases perfectamente a prueba de excepciones implementadas usando contenedores de punteros sin procesar.

+0

Es posible y, a veces, la mejor opción, pero si una clase contiene 2 o más punteros RAW por lo que es seguro excepción no es trivial. Pero debería marcarlo por no responder la pregunta. –