C ++ tiene que ver con la propiedad de la memoria, también conocida como semántica de propiedad .
Es responsabilidad del propietario de una parte de la memoria asignada dinámicamente liberar esa memoria. Entonces, la pregunta realmente es a quién pertenece la memoria.
En C ++, la propiedad está documentada por el tipo en el que se envuelve un puntero sin formato, por lo que en un buen programa (IMO) C ++ es muy raro ( raro , no nunca ) ver punteros sin procesar (ya que los punteros sin formato no tienen propiedad inferida, por lo que podemos no decir quién es el propietario de la memoria y, por lo tanto, sin una lectura cuidadosa de la documentación, no puede decir quién es el responsable de la propiedad).
Por el contrario, es raro ver punteros sin formato almacenados en una clase, cada puntero sin formato se almacena dentro de su propio contenedor de puntero inteligente. ( Nota: si no posee un objeto, no debería almacenarlo porque no puede saber cuándo saldrá del alcance y será destruido).
Entonces la pregunta:
- ¿Qué tipo de semántica de propiedad ha encontrado la gente?
- ¿Qué clases estándar se utilizan para implementar esa semántica?
- ¿En qué situaciones los encuentra útiles?
Mantengamos 1 tipo de propiedad semántica por respuesta para que se puedan votar hacia arriba y hacia abajo individualmente.
Resumen:
Conceptualmente, los punteros inteligentes son simples y una implementación ingenua es fácil. He visto muchos intentos de implementación, pero invariablemente se rompen 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 los suyos propios. std::auto_ptr
o uno de los indicadores inteligentes de Boost parece cubrir todas mis necesidades.
std::auto_ptr<T>
:
Una sola persona es propietaria del objeto. Se permite la transferencia de propiedad.
Uso: esto le permite definir interfaces que muestran la transferencia explícita de propiedad.
boost::scoped_ptr<T>
Una sola persona es propietaria del objeto. NO se permite la transferencia de propiedad.
Uso: se utiliza 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 un objeto puede tener varias flores con una vida útil que no se puede determinar en el momento de la compilación.
boost::weak_ptr<T>
:
Se usa con shared_ptr<T>
en situaciones en las que puede ocurrir un ciclo de punteros.
Uso: Se utiliza para evitar que los ciclos retengan objetos cuando solo el ciclo mantiene un recuento de referencia compartido.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
¿Se puede reformular esto? No lo entiendo en absoluto.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. Los punteros RAW no tienen semántica de propiedad. Si no conoce al propietario, no sabe quién es responsable de eliminar el objeto. Hay varias clases estándar que se utilizan para ajustar punteros (std :: shared_ptr, std :: unique_ptr, etc.) que definen la propiedad y, por lo tanto, defina quién es responsable de eliminar el puntero.