Punteros inteligentes: ¿O quién es el dueño de tu bebé? [cerrado

C ++ tiene que ver con la propiedad de la memoria
Aka " Semántica de propiedad"

Es responsabilidad del propietario de una porción de memoria asignada dinámicamente liberar esa memoria. Entonces la pregunta realmente se convierte en quién posee el recuerdo.

En C ++ la propiedad está documentada por el tipo de puntero RAW que está envuelto en su interior, por lo tanto, en un buen programa C ++ (IMO) es muy raro [RARO NUNCA] ver punteros RAW pasados (ya que los punteros RAW no tienen propiedad inferida, por lo que podemos no decir quién posee la memoria y, por lo tanto, sin una lectura cuidadosa de la documentación, no se puede saber quién es responsable de la propiedad).

Por el contrario, es raro ver punteros RAW almacenados en una clase cada puntero RAW se almacena dentro de su propio contenedor de puntero SMART. NÓTESE BIEN. Si no posee un objeto, no debería almacenarlo porque no puede saber cuándo saldrá del alcance y será destruido).

Así que la pregunta:

¿Qué tipo de propiedad semántica han encontrado las personas?Qué clases estándar se utilizan para implementar esa semántica? ¿Qué situaciones les resultan útiles?

Dejemos 1 tipo de propiedad semántica por respuesta para que se puedan votar arriba y abajo individualmente

Resumen

Conceptualmente, los punteros inteligentes son simples y las implementaciones ingenuas son fáciles. He visto muchos intentos de implementación, pero invariablemente están rotos de alguna manera que no es obvia para el uso casual y los ejemplos. Por lo tanto, recomiendo usar siempre "punteros inteligentes" bien probados de una biblioteca en lugar de usar el suyo propio. std :: auto_ptr o uno de los punteros inteligentes de impulso parecen cubrir todas mis necesidades.

std :: auto_ptr <T>:

Persona individual posee el objeto.
Pero la transferencia de propiedad está permitida.

Uso
======
Esto le permite definir interfaces que muestran la transferencia explícita de propiedad.

boost :: scoped_ptr <T>

Persona individual posee el objeto.
La transferencia de propiedad NO está permitida.

Uso
======
Se usa para mostrar propiedad explícita.
El objeto será destruido por el destructor o cuando se restablezca explícitamente.

boost :: shared_ptr <T> (std :: tr1 :: shared_ptr <T>)

Propiedad múltiple.
Este es un puntero contado de referencia simple. Cuando el recuento de referencia llega a cero, el objeto se destruye.

Uso
======
Cuando el objeto puede tener múltiples propietarios con una vida útil que no se puede determinar en tiempo de compilación.

boost :: weak_ptr <T>

Utilizado con shared_ptr <T>.
En situaciones donde puede ocurrir un ciclo de punteros.

Uso
======
e utiliza para evitar que los ciclos retengan objetos cuando solo el ciclo mantiene un recuento compartido.

Respuestas a la pregunta(22)

Su respuesta a la pregunta