2010-09-22 15 views
8

Estoy queriendo un puntero inteligente contado no de referencia que puede combinar algunos de los aspectos útiles de auto_ptr y shared_ptr. Creo que el unique_ptr de C++ 0x es en última instancia lo que necesitaría, pero necesito algo que compile en Visual Studio 2008 y Xcode (gcc 4.2).¿Hay un puntero inteligente general como auto_ptr y shared_ptr que no necesita C++ 0x?

La funcionalidad que necesito es:

  • Utilizable en métodos de fábrica de manera que se transfiere la propiedad de la copia (como auto_ptr)
  • Soporta release() (como auto_ptr)
  • Puede ser utilizado con la declaración hacia adelante (como shared_ptr)

Entonces, supongo que es realmente una mejor auto_ptr. ¿Hay algo que haga esto en el impulso o en otro lugar (nota: no tengo tiempo para entender a Loki)? ¿O debería simplemente rodar el mío?

EDIT: Acabo de leer más sobre auto_ptr - suena como si puede utilizarlo con declaraciones adelantadas si se asegura de que la cabecera de la clase se incluye en cada archivo .cpp que hace referencia a la cabecera con el Smart puntero (por ejemplo, ver GotW). ¿Alguien tiene algún consejo general o reglas generales sobre esto?

EDIT2 EDIT2: La razón shared_ptr no es aceptable porque necesito un método de liberación() ya que estoy ordenando algún código heredado mediante la introducción de métodos de fábrica, pero tiene que coexistir con algún código de propiedad de puntero manual. Usar shared_ptr en toda la base del código sería genial, pero una tarea enorme.

EDIT3: Al final, auto_ptr fue adecuado para el trabajo una vez que descubrí las peculiaridades de la inclusión directa. También sería interesante intentar escribir un eliminador personalizado para shared_ptr para permitir el borrado opcional del puntero.

+0

Esto es exactamente lo que yo uso para auto_ptr. Hasta que comencé a usar boost (o en situaciones donde no puedo usar boost). –

+0

Eche un vistazo a https://github.com/codenrun/auto_ptr_custom. Agrega un eliminador personalizado a una interfaz auto_ptr like. La razón – fizzbuzz

Respuesta

5

Editar: En mi respuesta original, no entendí que boost::shared_ptr no es aceptable para usted (probablemente por motivos de rendimiento).

auto_ptr hace, como se señala, la declaración de apoyo de avance. Debe incluir el encabezado de la clase referenciada en aquellos lugares que pueden destruir el objeto al que hace referencia el auto_ptr. Tenga en cuenta, sin embargo, que la semántica de auto_ptr es un poco peculiar y requiere cierto cuidado.

Las respuestas a la siguiente pregunta contiene más información, incluyendo la razón por la unique_ptr sólo puede ser aplicado para C++ 0x, ya que requiere referencias rvalue:

unique_ptr boost equivalent?

+0

'shared_ptr' no es aceptable es porque necesito un' liberación() 'método que estoy ordenando un poco de código heredado mediante la introducción de métodos de fábrica, pero tiene que coexistir con un código de propiedad puntero manual. Usar 'shared_ptr' en toda la base del código sería genial, pero una gran tarea. –

+0

@the_mandrill: No veo cómo eso es un problema. Boost permite eliminadores personalizados. Puede escribir un eliminador personalizado que no sirva para los punteros que ha lanzado. – MSalters

+0

Si escribe un eliminador de personalizaciones no operativo, ¿no impide eso soltar el puntero? ¿O te refieres a un eliminador personalizado donde puedes alternar entre eliminar/no eliminar en tiempo de ejecución? –

2

C++ TR1 (apoyados por moderno GCC y Visual Studio) tiene incorporado shared_ptrand others (cf. Wikipedia). Esos han sido tomados en su mayoría de Boost que funciona para casi cualquier compilador moderno.

Si necesita una propiedad estricta, puede consultar el scoped_ptr.

+0

ambos no son una opción viable según the_mandrill. shared_ptr utiliza el recuento de referencias y scoped_ptr no es compatible con la versión. – sellibitze

2

Con algunos códigos repetitivos puede approximateunique_ptr en C++ 03. No es una emulación perfecta.Usted necesitará un par más explícitas move llamadas, por ejemplo, ser capaz de devolver un local de unique_ptr.

Cuestiones relacionadas