¿Qué es la propiedad de recursos o punteros?

Resuelto asked hace 6 años • 0 respuestas

¿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?

 avatar Feb 28 '18 15:02
Aceptado

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.