2011-03-04 17 views
16

¿Cuándo se debe usar intrusive_ptr en lugar de shared_ptr?Boost punteros inteligentes

+0

+1 bonita pregunta, pero un [posible duplicado] (http://stackoverflow.com/questions/569775/smart-pointers-boost-explained). –

Respuesta

15

Cuando ya tiene un contador de referencia almacenado dentro del objeto que está señalando.

+1

+1, además del error tipográfico, así que lo arreglé para ti :). –

11

más allá de la biblioteca C++ estándar: Una introducción a la Boost Por Björn Karlsson

En la mayoría de las situaciones, no se debe impulsar el uso :: intrusive_ptr, debido a que la funcionalidad de la propiedad compartida es fácilmente disponible en alza: : shared_ptr, y un puntero inteligente no intrusivo es más flexible que un puntero inteligente intrusivo. Sin embargo, hay ocasiones en que se necesita un recuento de referencias intrusivas, tal vez para el código heredado o para la integración con clases de terceros. Cuando surge la necesidad, intrusive_ptr se ajusta a la ley, con la misma semántica que las otras clases de punteros inteligentes de Boost.

Al usar otro de los punteros inteligentes de Boost, garantiza una interfaz coherente para todas las necesidades de puntero inteligente, ya sean intrusivas o no. El recuento de referencias debe ser proporcionado por las clases que se utilizan con intrusive_ptr. intrusive_ptr gestiona el recuento de referencias realizando llamadas no calificadas a dos funciones, intrusive_ptr_add_ref e intrusive_ptr_release; estas funciones deben manipular adecuadamente el recuento de referencias intrusivas para que intrusive_ptrs funcione correctamente. Para todos los casos en que ya existe un recuento de referencias en los tipos que se van a utilizar con intrusive_ptr, habilitar la compatibilidad con intrusive_ptr es tan fácil como implementar esas dos funciones.

Uso intrusive_ptr cuando

  • Es necesario tratar esto como un puntero inteligente.
  • Existe un código que usa o proporciona un recuento de referencias intrusivas.
  • Es imperativo que el tamaño del puntero inteligente sea igual al tamaño de un puntero sin formato.
3

Lo que dijo Nick. Un ejemplo de la vida real es administrar punteros COM.

Cuestiones relacionadas