He estado evaluando varias implementaciones de punteros inteligentes (wow, hay un MUCHO por ahí) y me parece que la mayoría de ellos se pueden clasificar en dos grandes clasificaciones:¿Cuál es la mejor manera de implementar punteros inteligentes en C++?
1) Esta categoría usa herencia en el objetos a los que se hace referencia para que tengan recuentos de referencia y, por lo general, up() y down() (o sus equivalentes) implementados. IE, para usar el puntero inteligente, los objetos a los que apunta deben heredar de alguna clase que proporciona la implementación de ref.
2) Esta categoría utiliza un objeto secundario que mantiene la cuenta de referencia. Por ejemplo, en lugar de apuntar el puntero inteligente directamente a un objeto, apunta a este objeto de metadatos ... ¿Quién tiene un recuento de referencias y las implementaciones hacia arriba() y hacia abajo (y quién suele proporcionar un mecanismo para que el puntero Acceda al objeto real al que apunta, de modo que el puntero inteligente pueda implementar correctamente el operador ->()).
Ahora, 1 tiene la desventaja de que fuerza a todos los objetos que desea referencia contar heredar de un ancestro común, y esto significa que no puede usar esto para hacer referencia a objetos de conteo que no tiene control sobre el código fuente a.
2 tiene el problema de que dado que el conteo se almacena en otro objeto, si alguna vez tiene una situación que un puntero a un objeto contado de referencia existente se está convirtiendo en una referencia, es probable que tenga un error (IE, ya que el recuento no está en el objeto real, no hay forma de que la nueva referencia obtenga el recuento ... ref ref ref copia la construcción o la asignación está bien, porque pueden compartir el objeto de conteo, pero si alguna vez tiene que convertir desde un puntero, estás totalmente regado) ...
Ahora, como yo lo entiendo, boost :: shared_pointer usa el mecanismo 2, o algo así ... Dicho esto, no puedo decidirme qué ¡es peor! Solo he usado el mecanismo 1, en el código de producción ... ¿Alguien tiene experiencia con ambos estilos? ¿O tal vez hay otra forma mejor que ambas?
Además, la versión reforzada de shared_ptr se ha migrado a TR1 y, con el tiempo, será una biblioteca estándar de C++. –
Una comparación de rendimiento de impulsores inteligentes está aquí: http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/smarttests.htm –