C ++ shared_ptr

C ++ shared_ptr
El shared_ptr es un tipo de punteros inteligentes de C ++ que contiene la propiedad compartida del objeto creado por el puntero. Comparte la propiedad del objeto al almacenar el puntero en otro objeto, y el contador de referencia compartido cuenta el número de propietarios. El shared_ptr aumenta el contador de referencia por uno después de copiar el objeto y disminuye el contador de referencia por uno después de destruir el objeto. La memoria propiedad del objeto se reasigna si el objeto es propiedad de la última shared_ptr es destruido o el reiniciar() Se llama a la función para asignar otro puntero para el objeto. Cuando el shared_ptr no posee ningún objeto, entonces se llama un puntero compartido vacío. Diferentes usos del shared_ptr se han mostrado en este tutorial.

Ejemplo 1: Declarar un puntero compartido de diferentes maneras

En el siguiente ejemplo se muestran tres formas diferentes de declarar un puntero compartido. Se ha declarado una clase con un constructor y un método público en el código. El constructor imprimirá un mensaje cuando se cree un nuevo objeto compartido con el constructor. El Mostrar() El método imprimirá mensajes basados ​​en el objeto de puntero compartido llamado. Aquí, el primer objeto de puntero compartido se ha creado sin llamar al constructor. El segundo objeto de puntero compartido se ha creado llamando al constructor. El tercer puntero compartido ha creado asignando el primer puntero compartido. El Mostrar() El método se ha llamado tres veces utilizando tres objetos de puntero compartidos.

// Incluye las bibliotecas necesarias
#incluir
#incluir
usando NamesPacestd;
// Defina la clase
classmyclass
público:
// Declarar el constructor
Mi clase()
cout<<"The constructor is called.\n";

// declarar un método para imprimir texto
Voiddisplay (String Str)

cout<<"The Display() method is called from the "<< str <<" pointer.\n";

;
intmain ()

// Inicializar Shared_PTR sin llamar al constructor
shared_ptr p1 = make_shared ();
P1-> Display ("Primero");
// Inicializar Shared_PTR llamando al constructor
shared_ptr p2 = shared_ptr (newmyclass);
P2-> Display ("Segundo");
// Inicializar Shared_PTR por asignación
shared_ptr p3 = p1;
P3-> Display ("Third");
return0;

Producción:

La siguiente salida aparecerá después de ejecutar el código anterior. El constructor ha llamado solo en el momento de la creación de objetos del segundo. Entonces, el mensaje del constructor se ha impreso solo una vez:

Ejemplo 2: Imprima la ubicación de puntero compartido almacenado

La función get () compartida se usa para devolver la ubicación almacenada del puntero compartido. El siguiente ejemplo imprimirá la ubicación de los punteros compartidos almacenados que crean la clase y la función. Aquí, se ha definido una clase con un constructor para que se use para crear un puntero compartido. Se ha declarado que una función crea un puntero compartido e imprime la ubicación del puntero compartido usando la función get (). En este código, el primer puntero compartido se ha creado usando la clase, el segundo puntero compartido se ha creado utilizando la función, y el tercer puntero compartido se ha creado asignando el primer puntero.

// Incluye las bibliotecas necesarias
#incluir
#incluir
usando NamesPacestd;
// Defina la clase
clase de clase

público:
// Declarar el constructor
Mi clase()
cout<<"The constructor is called.\n";

;
// Definir la función para inicializar el puntero
voidinit_shared_ptr ()

shared_ptr p2 (newmyclass);
cout<
intmain ()

// Inicializar Shared_PTR llamando al constructor
shared_ptr p1 = shared_ptr (newmyclass);
cout<// Inicializar Shared_PTR llamando a la función
Init_shared_ptr ();
// Inicializar Shared_PTR por asignación
shared_ptr p3 = p1;
cout<return0;

Producción:

La siguiente salida similar aparecerá después de ejecutar el código anterior. En la salida, el valor devuelto de la función get () para el primer y tercer punteros compartidos son los mismos. Sin embargo, el segundo puntero compartido es diferente:

Ejemplo 3: Cuente los objetos del puntero compartido

El siguiente ejemplo muestra una forma de contar el número de objetos señalados por un puntero compartido después de crear y destruir el puntero. Se ha declarado una clase con un constructor en el código. El primer puntero compartido se ha creado usando la clase, y el segundo puntero compartido se ha creado utilizando el primer puntero compartido. El número de objetos señalados por ambos punteros compartidos antes y después de llamar a la función RESET () se ha imprimido más tarde.

// Incluye las bibliotecas necesarias
#incluir
#incluir
usando NamesPacestd;
// Defina la clase
classmyclass
público:
// Declarar el constructor
Mi clase()
cout<<"The constructor is called.\n";

;
intmain ()

// Inicializar el primer shared_ptr llamando al constructor
shared_ptr p1 (newmyclass);
// Muestra el número de objetos shared_ptr por el primer puntero
cout<<"p1 pointing to "<< p1.use_count() <<" object(s).\n";
// Inicializar el segundo shared_ptr usando el primer shared_ptr
shared_ptr p2 (p1);
// Muestra el número de objetos shared_ptr por el primer y segundo punteros
cout<<"p2 pointing to "<< p2.use_count() <<" object(s).\n";
cout<<"p1 pointing to "<< p1.use_count() <<" object(s).\n";
// Eliminar la propiedad del primer puntero del objeto shared_ptr
P1.reiniciar();
// Muestra el número de objetos shared_ptr por el segundo puntero
cout<<"p2 pointing to "<< p2.use_count() <<" object(s).\n";
return0;

Producción:

La siguiente salida aparecerá después de ejecutar el código anterior. El primer puntero, P1, está apuntando a un objeto después de la creación. Después de crear el segundo puntero, p2, Usando el primer puntero, P1, Ambos punteros apuntan a dos objetos para compartir el puntero. Después de llamar a la función RESET () para el puntero, P1, un objeto ha sido destruido y el puntero, p2, ahora apunta a un solo objeto.

Conclusión:

Los propósitos de usar un puntero compartido en C ++ se han explicado en este tutorial mediante el uso de ejemplos simples. Crear punteros compartidos de diferentes maneras, estar almacenado ubicación de puntero compartido y contando el número de objetos señalados por los punteros compartidos. Espero que los codificadores C ++ puedan usar el puntero compartido en su código después de leer este tutorial.