C++: Punteros inteligentes

Uso de punteros débiles con C++ Smart Pointers

¡Prueba gratis durante 10 días

nuestros 1218 cursos !

Prueba gratis Mostrar modalidades de suscripción
Un puntero débil es un caso especial de un puntero compartido. De hecho, se crea a partir de él. Es muy útil para evitar las referencias circulares. Aquí veremos cómo crearlo y utilizarlo en nuestro código.
04:16

Transcripción

Un puntero débil es un caso especial del puntero compartido. No se cuenta en el contador de referencia del puntero compartido, lo que es útil en los casos en los que se necesita un puntero que no afecte a la vida útil del recurso al que apunta. Aquí tengo una copia de weak pointer.cpp de los archivos base. También tengo la clase strc abierta en este proyecto. Un puntero débil se crea a partir de un puntero compartido. Si nos vamos abajo en el 'Main' pasaremos por todo esto en un minuto. Eso es importante, pero vamos a ver cómo se crea el puntero débil. He creado un puntero compartido utilizando el 'make_shared'. El 'string' es "thing". Hago varias copias suyas, con lo que el contador de referencia debería ser seis. Compilo y ejecuto. Verás que pongo 'haz varias copias', y que ahora el contador de referencia es seis. Cuando ahora lo saco por pantalla con 'display', muestra el seis entre paréntesis, que es el contador de referencia. Estoy usando la misma función 'display' que utilizaba en el ejemplo del puntero compartido. Esta de aquí es para mostrar el puntero débil y es un poco más complicada. Así que primero vamos a ver cómo crear un puntero débil. Se crea a partir de un puntero compartido. Aquí estoy pasando al constructor, le estoy pasando un puntero compartido, el 'A'. Después llamo a 'display' con el puntero débil. Este es el objeto 'display', la versión del puntero débil de 'display'. Aquí tengo 'use_count', y lo saco por pantalla como 'S'. 'S' es el contador de uso del puntero compartido. Después llamo a 'lock' en el puntero compartido en vez de hacerlo en el puntero débil. Esa función 'lock' devuelve un puntero compartido al que puedo acceder. Por lo tanto, no puedo acceder al valor o al objeto gestionado directamente desde un puntero débil. Primero tengo que llamar a su función 'lock'. Si llamo a 'lock', luego saco el valor por pantalla de ese nuevo puntero compartido. Ese contador es el del puntero débil. Luego está 'use_count' del nuevo puntero compartido del que he hecho una copia. Puedes ver que me da una copia del puntero compartido original. Ahora, ese 'use_count', ese contador de referencia llega hasta siete. Era sólo seis cuando lo obtuve del puntero débil antes de llamar a la función 'lock'. Cuando todo esto sale del ámbito, el puntero compartido se destruye automáticamente, el puntero compartido temporal que he utilizado aquí, y eso disminuye el contador de referencia. Después salgo y reinicio mis copias y el contador de referencia vuelve a ser uno. Compruebo de nuevo mi puntero débil, que tiene un contador de referencia de uno. Su puntero compartido temporal vale dos porque se llama a 'lock', hace esa copia del puntero compartido y la usa. Después de destruir 'A', el puntero débil también se elimina, o, mejor dicho, se destruye. Sé que todo esto puede parecer un poco confuso. ¿Dónde debería usar un puntero débil? Un ejemplo muy habitual es si necesitas evitar las referencias circulares. Por ejemplo, un objeto jefe puede apuntar a los empleados que dirige, mientras que los objetos empleados pueden apuntar a los jefes a los que informan. Estos objetos se mantienen vivos entre ellos porque se hacen referencia los unos a los otros. Con los punteros inteligentes, con los punteros compartidos, el jefe no se podía destruir nunca, siempre que haya un empleado, y los empleados no se podrán destruir mientras exista el jefe. Es decir, no puedo destruir ninguno de ellos sin antes destruir al otro. La solución es hacer que al menos uno de estos punteros sea un puntero débil. Ahora se puede destruir a los empleados sin antes destruir al jefe. Esto rompe de forma efectiva la referencia circular. Un puntero débil es un caso especial de un puntero compartido que no se cuenta en el contador de referencia del puntero compartido. Es útil cuando necesitas un puntero a algo que puede existir o no. Se utiliza habitualmente para evitar las referencias circulares, aunque puede tener otros usos.

C++: Punteros inteligentes

Conoce los punteros inteligentes, un componente fundamental en C++, que garantizan que tanto la memoria como otros recursos se asignen de forma adecuada y eficaz.

25 min (7 Videos)
Actualmente no hay comentarios.
 
Software:
Fecha de publicación:14/12/2016

Este curso video2brain está disponible como descarga y para ser visualizado online. ¡Pero no hace falta que decidas entre las dos opciones! Al comprar el curso, disfrutarás de ambas posibilidades.

La descarga te permite ver las lecciones sin estar conectado/a a internet y supone una navegación fácil y ágil entre capítulo y capítulo. Si vas a trabajar en diferentes ordenadores o si no quieres descargarte el curso completo, entra en la web con tus datos de acceso y disfruta directamente de tus vídeos online. Te deseamos que disfrutes de este curso y te resulte de mucha utilidad.

Estamos a tu disposición si tienes cualquier tipo de duda o pregunta.