smart shared_ptr pointer make_shared example c++ c++11 shared-ptr weak-ptr

c++ - pointer - ¿Por qué el objeto de recuento de referencias de shared_ptr necesita realizar un seguimiento del número de weak_ptrs que apuntan al objeto también?



smart pointer c++ (3)

Hola. Estoy leyendo este documento y algunos otros documentos sobre shared_ptr C ++ y todos parecen sugerir que, aparte del número de shared_ptr apunta al objeto asignado, el objeto de recuento de referencia debe realizar un seguimiento de cuántos punteros weak_ptr apuntan al objeto. también. Mi pregunta es ¿por qué? Según tengo entendido, weak_ptr no es propietario, por lo que si el recuento de shared_ptr apunta al objeto llega a cero, el objeto se puede eliminar. Es por eso que a veces necesitamos usar expired para verificar la disponibilidad de un objeto apuntado por un valor weak_ptr . ¿Podría explicar la razón por la que necesita realizar un seguimiento del número de weak_ptr s?

¿Por qué necesitamos un conteo débil aquí?


Añadiendo a la respuesta de François Andrieux:

Hay un efecto secundario de esto que es muy importante entender.

Si usa una implementación de std :: make_shared que usa la optimización WKWYL (Sabemos dónde vive) para asignar el bloque de control y el objeto real en conjunto como una asignación contigua, la memoria NO SERÁ LIBRE hasta que todos los objetos weak_ptr también tengan fuera de alcance.

(mi cuenta rara vez se usa, por lo que no puedo agregar comentarios, debido a que no tengo suficientes puntos de reputación, por lo tanto, se agrega como una respuesta en lugar de un comentario)


El shared_ptr referencia shared_ptr es el recuento de propietarios del objeto. El weak_ptr referencia weak_ptr es el recuento de propietarios del bloque de control de recuento de referencia.


std::weak_ptr refiere al bloque de control para saber si el objeto todavía existe y, de ser así, para proporcionarle un std::shared_ptr cuando sea necesario. Por esa razón, el bloque de control debe existir siempre que exista un std::weak_ptr o un std::shared_ptr . std::weak_ptr hacer un seguimiento del número de instancias de std::weak_ptr para saber cuándo se destruye la última, al igual que para std::shared_ptr .