Pregunta

Todos sabemos que los punteros RAW deben incluirse en algún tipo de puntero inteligente para obtener una gestión de memoria segura para excepciones.Pero cuando se trata de contenedores de sugerencias, la cuestión se vuelve más espinosa.

Los contenedores estándar insisten en que el objeto contenido se pueda copiar, por lo que esto descarta el uso de std::auto_ptr, aunque aún puedes usar boost::shared_ptr, etc.

Pero también hay algunos contenedores de impulso diseñados explícitamente para contener punteros de forma segura:
Ver Biblioteca de contenedores de punteros

La pregunta es:¿En qué condiciones debería preferir utilizar ptr_containers en lugar de un contenedor de smart_pointers?

boost::ptr_vector<X>

or

std::vector<boost::shared_ptr<X> >
¿Fue útil?

Solución

Los contenedores de punteros de impulso tienen una propiedad estricta sobre los recursos que contienen.Un std::vector<boost::shared_ptr<X>> tiene propiedad compartida.Hay razones por las que esto puede ser necesario, pero en caso de que no lo sea, por defecto usaría boost::ptr_vector<X>.YMMV.

Otros consejos

Constante en:Los punteros inteligentes son un muy buen método para manejar la gestión de recursos, pero no el único.Estoy de acuerdo en que verá muy pocos punteros sin formato en código C++ bien escrito, pero en mi experiencia tampoco verá tantos punteros inteligentes.Hay muchas clases perfectamente seguras para excepciones implementadas utilizando contenedores de punteros sin formato.

Bueno, los gastos generales son un caso.

Un vector de punteros compartidos realizará muchas copias superfluas que implican crear un nuevo puntero inteligente, incrementar una referencia, disminuir una referencia, etc. al cambiar el tamaño.Todo esto se evita con un contenedor de punteros.

Sin embargo, requiere elaboración de perfiles para garantizar que las operaciones del contenedor sean el cuello de botella :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top