Significados semánticos de std :: auto_ptr y boost :: shared_ptr

En nuestro gran proyecto tenemos mucha clase con lo siguiente typedef's:

class Foo
{
  public:
    typedef std::auto_ptr<Foo> Ptr;
    typedef boost::shared_ptr<Foo> Ref;
  ...
};
...
Foo::Ref foo(new Foo);
...
doBar(foo);
...

Su uso es muy conveniente. Pero dudo si auto_ptr está semánticamente cerca de Ptr y shared_ptr es lo mismo que ref? O deberia auto_ptr ser utilizado explícitamente ya que tiene semántica de "transferencia de propiedad"?

Gracias,

preguntado el 31 de enero de 12 a las 08:01

5 Respuestas

std::auto_ptr tiene semántica de transferencia de propiedad, pero está bastante rota. Si puedes usar boost::shared_ptr, entonces deberías usar boost::unique_ptr en lugar de std::auto_ptr, ya que hace lo que cabría esperar. Transfiere la propiedad y invalida la instancia anterior, lo que std::auto_ptr no lo hace

Incluso mejor, si tu puede use C ++ 11, luego cambie a std::unique_ptr y std::shared_ptr.

Respondido el 31 de enero de 12 a las 12:01

std::auto_ptr no está roto. Como se especifica, es demasiado complejo, pero funciona bien para lo que fue diseñado, y ciertamente es más útil que boost::shared_ptr. - James Kanze

No deberías usar std::auto_ptr, está en desuso y lo considero peligroso, más aún cuando lo escondes detrás de un typedef tan genérico como Ptr.

No creo que tenga sentido llamar shared_ptrRef, en este caso es más Ptr que auto_ptr.

EDITAR: Lo considero peligroso porque puede usarlo incorrectamente fácilmente, incluso cuando comprende completamente su funcionamiento, puede usarlo incorrectamente accidentalmente, especialmente cuando lo esconde detrás de un typedef. Una buena clase debe ser fácil de usar correctamente y debería ser difícil de usar incorrectamente. Especialmente con la llegada de unique_ptr No veo ningún escenario útil para auto_ptr.

Respondido el 31 de enero de 12 a las 13:01

Quien considera std::auto_ptr ¿peligroso? - James Kanze

James Kanze: Sí. Editó la respuesta. - ronag

¿Cómo funciona una característica de idioma (auto_ptr en este caso) que para la mayoría de las personas es difícil de entender y usar sabiamente mas peligroso, Yo creo que auto_ptr es bastante útil si se usa con prudencia. Probablemente debería indicar auto_ptr el uso es peligroso si no comprende cómo funciona. - Alok Save

@phresnel Eso es cierto para la mayoría de las bibliotecas estándar :-): iteradores, manipuladores de iostream, streambuf etc. Eso no significa mas peligroso, sin embargo. Cuando necesitas la semántica de std::auto_ptr, hay muy pocas alternativas y funciona bien. Lo he usado en casi todas las aplicaciones desde que se ha vuelto estable, y todavía no veo que cause problemas a ningún programador de mantenimiento. - James Kanze

@ronag: std::auto_ptr está en desuso porque std::unique_ptr implementa el mismo contrato al mismo tiempo que lo hace más flexible sin comprometer la integridad: std::unique_ptr se puede mover mientras std::auto_ptr no poder. La razón de esto es la ausencia de soporte de referencia rvalue en C ++ 2003. Cuando el uso de referencias rvalue es una opción, std::unique_ptr es la mejor opción. - Dietmar Kühl

Creo que el orden es solo una nomenclatura que alguien usó.
Probablemente debería haber sido ref para auto_ptr y ptr para shared_ptr, porque:

Las referencias son inmutables y, por lo tanto, no se pueden hacer referencia a otro objeto. auto_ptr tiene una semántica similar (aunque remotamente similar), transferencia de propiedad, lo que significa que probablemente no querrá asignar un auto_ptr por el comportamiento no intuitivo que muestra. El objeto asignado adquiere la propiedad mientras que el objeto que se asigna pierde la propiedad.

Por otra parte shared_ptr tiene un mecanismo de recuento de referencias que es similar (de nuevo de forma remota) a varios punteros que pueden apuntar al mismo objeto. La propiedad del puntero recae en el shared_ptr sí mismo y se desasignará tan pronto como no haya instancias de puntero que se refieran a él.

Respondido el 31 de enero de 12 a las 12:01

Mucho depende de para qué se utilicen. Y en el caso de Ref, lo que la gente entiende por él. En los días anteriores al estándar, a menudo usaba un typedef para Ptr para mi puntero contado de referencia (invasivo); la presencia de tal typedef era, de hecho, una indicación de que el tipo soportaba el recuento de referencias y que siempre debería asignarse dinámicamente.

Ambos std::auto_ptr y boost::shared_ptr tienen una semántica muy especial. Tiendo a no usar typedefs para ellos, tanto por la semántica especial como porque (a diferencia del caso de mi puntero contado de referencia invasiva) son totalmente independientes del tipo al que apunta. Para cualquier tipo dado, puede usarlos o no, según lo requiera la lógica del programa. (Debido a su semántica particular, encuentro un buen número de usos para std::auto_ptr. Tiendo a evitar boost::shared_ptr, sin embargo; es bastante peligroso.)

Respondido el 31 de enero de 12 a las 12:01

auto_ptr está en desuso en C ++ 11. Es posible que desee dejar de usarlo y simplemente usar el shared_ptr. For shared_ptr, no hay transferencia de propiedad en la asignación, se cuenta el número de referencias al objeto y el objeto se destruye cuando se destruye el último puntero.

Respondido 01 Feb 12, 13:02

is obsoleto. Ahora que llegamos al 2012, esto debería ser evidente;) - Sebastián Mach

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.