smart - unique_ptr c++ 11
Débil_ptr, make_shared y desasignación de memoria (2)
¿Mi entendimiento es correcto?
Sí. Si su valor de weak_ptr
sobrevive significativamente al objeto (grande) y tiene make_shared
memoria, puede ser beneficioso evitar make_shared
.
Sin embargo, aquí "grande" se mide por tamaño y muchos objetos "grandes" conceptualmente (por ejemplo, la mayoría de los contenedores estándar, excepto std::array
) son bastante pequeños según esa métrica, ya que asignan memoria adicional para almacenar su contenido, que será liberado tan pronto como el objeto sea destruido.
Un bloque de control de shared_ptr
se mantiene vivo mientras haya al menos un weak_ptr
presente. Si el puntero compartido se creó con make_shared
eso implica que toda la memoria del objeto se mantiene asignada. (El objeto en sí está correctamente destruido, pero dado que el bloque de control y la memoria para el objeto se asignaron en una porción, como make_shared
hace make_shared
, solo se pueden desasignar juntos).
¿Mi entendimiento es correcto?
Parece que este comportamiento representa un problema, por ejemplo en el famoso "ejemplo de caché" . La memoria para los objetos se mantendrá asignada para siempre.
¿Es un problema en cualquier situación práctica? ¿ shared_ptr
debe crear el shared_ptr
utilizando un constructor en tal situación (objeto grande e intención de usar weak_ptr
s)?
Intenté esto en VS2013 y estás completamente correcto. Se llama al destructor cuando se destruye el último shared_ptr, por lo que cualquier otro objeto o memoria asociada con el objeto se destruirá, pero si el shared_ptr se crea con make_shared, la memoria nunca se destruye hasta que se destruye el último valor débil.
Creo que siempre es bueno limpiar o restablecer los puntos débiles si el bloqueo () falla porque incluso sin make_shared sigue usando algo de memoria.