c++ - shared_ptr - ¿Afecta std:: weak_ptrs cuando la memoria asignada por std:: make_shared está desasignada?
smart pointers c++ (2)
La implementación común es que el bloque de control ref de un std::shared_ptr
contenga un recuento de referencia fuerte y uno débil por separado. El objeto gestionado se destruye cuando el recuento de referencia fuerte se pone a cero, pero el bloque de control de ref en sí solo se libera cuando el recuento de referencia débil también llega a cero.
(Cuando usa std::make_shared
, el bloque de control ref contiene suficiente memoria para contener el objeto administrado. Esto es solo un detalle).
En otras palabras, el comportamiento observable para el objeto gestionado es independiente de los punteros débiles.
Si llamo a std::make_shared<T>
(en lugar de simplemente asignar un shared_ptr<T>
explícitamente), entonces espero que el recuento de referencias se asigne en la memoria junto con la instancia de T, por razones de rendimiento. Todo bien y bien.
Pero si tengo instancias weak_ptr
que weak_ptr
referencia al mismo objeto, es probable que necesiten acceso a ese recuento de referencias para saber si el objeto aún existe.
Entonces, cuando se destruye el último shared_ptr de la instancia de T, una comprensión ingenua del sistema implicaría que no puede desasignar la memoria en la que se almacena T, porque weak_ptrs aún requiere acceso a ese conteo.
Parece que hay un contador de referencia débil separado y en teoría podría mantenerse separado de la instancia de T, de modo que la T puede ser destruida y la memoria desasignada, mientras que las referencias débiles aún existen. Pero luego volvemos a tener 2 asignaciones separadas, frustrando los beneficios de make_shared
.
Supongo que estoy entendiendo mal algo aquí. ¿Cómo puede liberarse la memoria asignada para una instancia construida a través de std::make_shared
cuando existen referencias débiles?
Si usa make_shared
y la implementación usa una sola asignación para el objeto y los recuentos de referencias, entonces esa asignación no se puede liberar hasta que se hayan liberado todas las referencias (fuertes y débiles).
Sin embargo, el objeto se destruirá después de que se hayan liberado todas las referencias fuertes (independientemente de si todavía hay referencias débiles).