C ++ shared_ptr

C Shared_ptr



El compartit_ptr és un tipus de punteres intel·ligents de C ++ que conté la propietat compartida de l'objecte creat pel punter. Comparteix la propietat de l'objecte quan s'emmagatzema el punter en un altre objecte i el comptador de referència compartit compta el nombre de propietaris. El compartit_ptr augmenta el comptador de referència un després de copiar l'objecte i disminueix el comptador de referència un després de destruir l'objecte. La memòria propietat de l'objecte es reassigna si l'objecte propietat de l'últim shared_ptr es destrueix, o el reset () La funció es diu per assignar un altre punter a l'objecte. Quan el shared_ptr no posseeix cap objecte, i es diu punter compartit buit. Diferents usos del compartit_ptr s'han mostrat en aquest tutorial.

Exemple 1: declarar el punter compartit de diferents maneres

A l'exemple següent es mostren tres maneres diferents de declarar un punter compartit. S'ha declarat al codi una classe amb un constructor i un mètode públic. El constructor imprimirà un missatge quan es creï un nou objecte compartit amb el constructor. El Display () El mètode imprimirà missatges basats en l'objecte de punter compartit que crida. Aquí s’ha creat el primer objecte de punter compartit sense trucar al constructor. El segon objecte de punter compartit s'ha creat trucant al constructor. El tercer punter compartit s'ha creat assignant el primer punter compartit. El Display () S'ha anomenat el mètode tres vegades mitjançant l'ús de tres objectes de punter compartits.







// Incloeu les biblioteques necessàries

#incloure

#incloure

usingnamespacestd;

// Definiu la classe
classMyClass{
públic:
// Declareu el constructor
La meva classe() {
cost<<'Es diu el constructor. n';
}
// Declareu un mètode per imprimir text
voidDisplay(cadena str)
{
cost<<'El mètode Display () es diu des del'<<pàg<<'punter. n';
}
};

principal()
{
// Inicialitzeu shared_ptr sense trucar al constructor
shared_ptr p1=make_shared();
p1->Visualització('primer');
// Inicialitzeu shared_ptr trucant al constructor
shared_ptr p2=shared_ptr(newMyClass);
p2->Visualització('segon');

// Inicialitzeu shared_ptr per assignació
shared_ptr p3=p1;
p3->Visualització('tercer');
tornar0;
}

Sortida:



La sortida següent apareixerà després d'executar el codi anterior. El constructor només ha cridat en el moment de la creació del segon objecte. Per tant, el missatge del constructor només s’ha imprès una vegada:







Exemple 2: imprimiu la ubicació del punter compartit emmagatzemat

El punter compartit de la funció get () s'utilitza per retornar la ubicació del punter compartit emmagatzemat. L'exemple següent imprimirà la ubicació dels punters compartits emmagatzemats que la classe i la funció creen. Aquí s’ha definit una classe amb un constructor que s’utilitzarà per crear un punter compartit. S'ha declarat una funció per crear un punter compartit i imprimir la ubicació del punter compartit mitjançant la funció get (). En aquest codi, el primer punter compartit s'ha creat mitjançant la classe, el segon punter compartit s'ha creat mitjançant la funció i el tercer punter compartit s'ha creat assignant el primer punter.

// Incloeu les biblioteques necessàries

#incloure

#incloure

usingnamespacestd;

// Definiu la classe
classMyClass
{
públic:
// Declareu el constructor
La meva classe() {
cost<<'Es diu el constructor. n';
}
};
// Definiu la funció per inicialitzar el punter
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
cost<<p2.aconseguir() <<' n';
}

principal()
{
// Inicialitzeu shared_ptr trucant al constructor
shared_ptr p1=shared_ptr(newMyClass);
cost<<p1.aconseguir() <<' n';

// Inicialitzeu shared_ptr trucant a la funció
Init_shared_ptr();

// Inicialitzeu shared_ptr per assignació
shared_ptr p3=p1;
cost<<p3.aconseguir() <<' n';
tornar0;
}

Sortida:



La següent sortida similar apareixerà després d'executar el codi anterior. A la sortida, el valor retornat de la funció get () per al primer i el tercer punters compartits són els mateixos. Tanmateix, el segon punter compartit és diferent:

Exemple 3: Compteu els objectes del punter compartit

L'exemple següent mostra una manera de comptar el nombre d'objectes apuntats per un punter compartit després de crear-lo i destruir-lo. S'ha declarat al codi una classe amb un constructor. El primer punter compartit s’ha creat amb la classe i el segon punter compartit s’ha creat amb el primer punter compartit. El nombre d'objectes apuntats pels dos punteres compartits abans i després de trucar a la funció reset () s'ha imprès més tard.

// Incloeu les biblioteques necessàries

#incloure

#incloure

usingnamespacestd;
// Definiu la classe
classMyClass{
públic:
// Declareu el constructor
La meva classe() {
cost<<'Es diu el constructor. n';
}
};
principal()
{
// Inicialitzeu el primer shared_ptr trucant al constructor
shared_ptr p1(newMyClass);

// Mostra el nombre d'objectes shared_ptr pel primer punter
cost<<'p1 assenyalant'<<p1.use_count() <<'objecte (s). n';
// Inicialitzeu el segon shared_ptr mitjançant el primer shared_ptr
shared_ptr p2(p1);
// Mostra el nombre d'objectes shared_ptr pel primer i segon punters
cost<<'p2 assenyalant'<<p2.use_count() <<'objecte (s). n';
cost<<'p1 assenyalant'<<p1.use_count() <<'objecte (s). n';
// Elimineu la propietat del primer punter de l'objecte shared_ptr
p1.restableix();
// Mostra el nombre d'objectes shared_ptr pel segon punter
cost<<'p2 assenyalant'<<p2.use_count() <<'objecte (s). n';
tornar0;
}

Sortida:

La sortida següent apareixerà després d'executar el codi anterior. El primer punter, p1 , apunta cap a un objecte després de la creació. Després de crear el segon punter, p2 , utilitzant el primer punter, p1 , els dos indicadors apunten a dos objectes per compartir el punter. Després de trucar a la funció reset () del punter, p1 , un objecte ha estat destruït i el punter, p2 , ara apunta només a un objecte.

Conclusió:

Els propòsits d’utilitzar un punter compartit en C ++ s’han explicat en aquest tutorial mitjançant exemples senzills. Crear punteres compartits de diferents maneres, obtenir la ubicació del punter compartit emmagatzemat i comptar el nombre d’objectes apuntats pels punteres compartits. Espero que els codificadors C ++ puguin utilitzar el punter compartit al seu codi després de llegir aquest tutorial.