C++: Punteros inteligentes

Cómo crear un puntero compartido con C++ Smart Pointers

Prueba ahora LinkedIn Learning sin cargo y sin compromiso.

Prueba gratis Mostrar modalidades de suscripción
Si la funcionalidad de un puntero único no es suficiente, podemos usar un puntero compartido. Funciona de forma muy similar, aunque en este caso sí que podremos hacer copias del puntero compartido. Gracias a su sencillez de uso y a su eficacia, es probablemente el puntero inteligente que más se utiliza.
05:39

Transcripción

Un puntero compartido funciona de forma muy similar a un puntero único, con la diferencia de que puedes hacer copias de un puntero compartido. Aquí tengo una copia de "shared_ptr.cpp" de los archivos base. También tengo la clase STRC abierta en este proyecto. Un puntero compartido se crea con la función plantilla "Make shared" así. voy a compilar y ejecutarlo para que podamos ver qué sucede aquí. Puedes ver que he creado un nuevo puntero con la palabra "New", lo que hace que STRC se llame a su constructor eso crea un nuevo objeto con New y si pongo aquí un Display, se ve lo que hace. Vuelvo a compilar y a ejecutar, ahora ves que muestra la palabra New, que es el String que está en CString en STRC, además muestra un número 1. Aquí está mostrando el "Use Count" que es un contador de referencia en el puntero compartido. Volveremos a hablar sobre esto en unos minutos. También puedes crear un puntero compartido directamente sin usar Make Shared. Make shared se incluye en los compiladores que admiten los punteros inteligentes. Esto formaba parte de C++11 y Make Unique no se incluyó hasta C++14. Aún así, puedes crear uno directamente. En su lugar puedes poner Standar Shared Pointer, y darle el nombre de la clase del objeto que se está gestionando, que en este caso es STRC. Después le pasamos New, aquí ponemos "New" (new strc ("foo")); así Vemos lo que tenemos. Luego puedo poner disp(x); aquí. Si compilamos y ejecutamos vemos lo que tenemos, se muestra X. Tiene dentro la candena "foo" y el contador de referencia de uno. También puedes ver el constructor para eso, pero se recomienda utilizar la función plantilla Make Shared. Esa es la forma adecuada de hacerlo, en la mayoría de los casos lo harás así. La diferencia principal entre un puntero compartido y un puntero único es que el compartido se puede copiar. La clase de puntero compartido mantiene un contador de las copias utilizando el constructor y el destructor de copia de la clase del puntero compartido. Este contador se suele denominar "contador de referencia". Cada vez que se hace una copia se incrementa el contador de referencia, y cuando se destruye una copia se decrementa el contador. Cuando el contador llega a cero se destruye el objeto. El objeto gestionado. Se accede al contador de referencia con este método Use Count de aquí en el objeto del puntero compartido. Vamos a poner un ejemplo. Me voy a aquí abajo, y voy a hacer un montón de copias de A aquí, así. voy a hacer 5 copias y a enumerarlas, dos, tres ,cuatro y cinco Ahora pongo disp(a) y después destruyo las copias con "x1.reset", dos, tres, cuatro, cinco, así Al final ponemos disp(a), compiló y ejecutó esto, obtengo un contador de referencia de seis y luego un contador de uno, después de haber hecho todas estas copias, incluso aunque siga mostrando A, puedes ver que el contador de referencia ahora es seis. Ese contador de referencia procede de este método Use Count en el objeto del puntero compartido. El objeto no se destruye hasta que el contador de referencia llega a cero. Por supuesto, puedo hacer una copia. Aquí he hecho una copia, A es igual a B. El contador de referencia sube a dos. Los objetos se comparan a igual y sus punteros se comparan a igual, esto es así porque están apuntando a lo mismo y el puntero tradicional tiene exactamente la misma dirección y los operadores de igual, lógicamente sobrecargados por la clase del puntero inteligente. Así que si reiniciamos A a dos, utilizamos el método reset en el puntero compartido y le damos un nuevo objeto de dos. Ahora A y B son diferentes. Puedes ver que cada uno tiene un contador de referencia de uno. Esto ha decrementado el contador de referencia en A porque antes era dos. Porque teníamos una copia y ahora es solo uno, ahora A ya no es igual a B. También podemos intercambiarlos utilizando el método de Swap. Los intercambiamos y no se llama a ningún constructor ni destructor También podemos utilizar el método Swap estándar, al hacerlo, verás que se llama a los constructores y destructores e intercambiamos los punteros. Si intercambiamos los objetos, verás que ya no se llama a los constructores y destructores. Cuando llega al final del ámbito se llama a los destructores porque se destruyen los punteros inteligentes, cuando se destruyen, gestionan correctamente los objetos y los destruyen llamando a los destructores. Por tanto, el puntero compartido es probablemente el puntero inteligente que más se usa, es muy eficaz y muy fácil de usar, además, hace que la gestión de los recursos de memoria compartida sea muy sencilla.

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.