¿Qué es la propiedad de recursos o punteros?
¿Qué significa expresar “Propiedad de los recursos”? ¿Es lo mismo que tener propiedad sobre punteros? Por ejemplo, en esta respuesta , se usó la expresión "Los POD no pueden expresar la propiedad de punteros o recursos". Las clases que implican gestión dinámica de la memoria, ¿expresan propiedad de punteros o recursos?
No creo que exista una definición universalmente aceptada, 100% precisa y siempre aplicable, pero la definición de propiedad más útil que he encontrado en el contexto de C++ (y de la programación en general) es la responsabilidad de la limpieza. Es decir, el propietario de un recurso es el responsable de la limpieza correcta de ese recurso.
Lo que significan "recurso" y "limpieza" depende del contexto. Cuando el recurso es memoria asignada dinámicamente a través de new
, se llama a la limpieza delete
. Cuando el recurso es un descriptor de archivo, la limpieza lo cierra. Etcétera.
Es por eso que Plain Old Data no puede expresar propiedad: una clase POD debe tener un destructor no operativo y, por lo tanto, no puede realizar ninguna limpieza automática.
Comparar int *
, std::unique_ptr<int>
y std::shared_ptr<int>
. Todos estos tipos son "un puntero a un int
". Pero el primero no representa propiedad: puedes hacer lo que quieras con él y puedes usarlo felizmente de maneras que provoquen pérdidas de memoria o dobles liberaciones.
std::unique_ptr<int>
representa la forma más simple de propiedad: dice "Soy el único propietario del recurso (= el asignado dinámicamente int
). Cuando me destruyen, lo limpio correctamente". Está diseñado para no ofrecer una forma sensata de violar la semántica de propiedad (por ejemplo, no se puede copiar).
std::shared_ptr<int>
representa una forma más compleja de propiedad: "Pertenezco a un grupo de amigos que son colectivamente responsables del recurso. El último de nosotros en ser destruido lo limpiará". Nuevamente, hay algunos obstáculos que superar antes de poder violar la semántica.