C ++ Shared_Ptr

C ++ Shared_Ptr
O shared_ptr é um tipo de ponteiros inteligentes de C ++ que contém a propriedade compartilhada do objeto criado pelo ponteiro. Ele compartilha a propriedade do objeto ao armazenar o ponteiro em outro objeto, e o balcão de referência compartilhado contém o número de proprietários. O shared_ptr aumenta o contador de referência por um depois de copiar o objeto e diminui o contador de referência por um depois de destruir o objeto. A memória de propriedade do objeto é realocada se o objeto de propriedade do último shared_ptr é destruído, ou o reiniciar() A função é chamada para atribuir outro ponteiro para o objeto. Quando o shared_ptr não possui nenhum objeto, então é chamado de ponteiro compartilhado vazio. Diferentes usos do shared_ptr foram mostrados neste tutorial.

Exemplo 1: Declare o ponteiro compartilhado de maneiras diferentes

Três maneiras diferentes de declarar um ponteiro compartilhado são mostradas no exemplo a seguir. Uma classe com um construtor e um método público foram declarados no código. O construtor imprimirá uma mensagem quando um novo objeto compartilhado for criado com o construtor. O Mostrar() O método imprimirá as mensagens com base no objeto de ponteiro compartilhado de chamada. Aqui, o primeiro objeto de ponteiro compartilhado foi criado sem chamar o construtor. O segundo objeto de ponteiro compartilhado foi criado chamando o construtor. O terceiro ponteiro compartilhado criou atribuindo o primeiro ponteiro compartilhado. O Mostrar() O método foi chamado três vezes usando três objetos de ponteiro compartilhado.

// inclui bibliotecas necessárias
#incluir
#incluir
Usandonamespacestd;
// Defina a classe
ClassMyclass
público:
// declarar o construtor
Minha classe()
cout<<"The constructor is called.\n";

// Declare um método para imprimir o texto
VoidDisplay (String str)

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

;
intmain ()

// Inicialize shared_ptr sem chamar construtor
shared_ptr p1 = make_shared ();
p1-> display ("primeiro");
// Inicialize Shared_ptr ligando para o construtor
shared_ptr p2 = shared_ptr (newmyclass);
P2-> Display ("Segundo");
// inicialize shared_ptr por atribuição
shared_ptr p3 = p1;
p3-> display ("terceiro");
return0;

Saída:

A saída a seguir aparecerá após a execução do código acima. O construtor chamou apenas no momento da criação de segundos objetos. Então, a mensagem do construtor foi impressa apenas uma vez:

Exemplo 2: Imprima a localização do ponteiro compartilhado armazenado

O ponteiro compartilhado da função get () é usado para devolver o local do ponteiro compartilhado e armazenado. O exemplo a seguir imprimirá a localização dos ponteiros armazenados e compartilhados que são criados pela classe e pela função. Aqui, uma aula com um construtor foi definida para ser usada para criar um ponteiro compartilhado. Uma função foi declarada para criar um ponteiro compartilhado e imprimir o local do ponteiro compartilhado usando a função get (). Neste código, o primeiro ponteiro compartilhado foi criado usando a classe, o segundo ponteiro compartilhado foi criado usando a função e o terceiro ponteiro compartilhado foi criado ao atribuir o primeiro ponteiro.

// inclui bibliotecas necessárias
#incluir
#incluir
Usandonamespacestd;
// Defina a classe
ClassMyclass

público:
// declarar o construtor
Minha classe()
cout<<"The constructor is called.\n";

;
// Defina função para inicializar o ponteiro
voidinit_shared_ptr ()

shared_ptr p2 (newmyclass);
cout<
intmain ()

// Inicialize Shared_ptr ligando para o construtor
shared_ptr p1 = shared_ptr (newmyclass);
cout<// inicialize shared_ptr chamando a função
Init_shared_ptr ();
// inicialize shared_ptr por atribuição
shared_ptr p3 = p1;
cout<return0;

Saída:

A seguinte saída semelhante aparecerá após a execução do código acima. Na saída, o valor retornado da função get () para o primeiro e o terceiro ponteiros compartilhados são os mesmos. No entanto, o segundo ponteiro compartilhado é diferente:

Exemplo 3: Conte os objetos de ponteiro compartilhado

O exemplo a seguir descreve uma maneira de contar o número de objetos apontados por um ponteiro compartilhado depois de criar e destruir o ponteiro. Uma aula com um construtor foi declarada no código. O primeiro ponteiro compartilhado foi criado usando a classe, e o segundo ponteiro compartilhado foi criado usando o primeiro ponteiro compartilhado. O número de objetos apontados por ambos os ponteiros compartilhados antes e depois de chamar a função RESET () foi impressa posteriormente.

// inclui bibliotecas necessárias
#incluir
#incluir
Usandonamespacestd;
// Defina a classe
ClassMyclass
público:
// declarar o construtor
Minha classe()
cout<<"The constructor is called.\n";

;
intmain ()

// inicialize o primeiro shared_ptr ligando para o construtor
shared_ptr p1 (newmyclass);
// exibe o número de objetos shared_ptr pelo primeiro ponteiro
cout<<"p1 pointing to "<< p1.use_count() <<" object(s).\n";
// inicialize o segundo shared_ptr usando o primeiro shared_ptr
shared_ptr p2 (p1);
// exibe o número de objetos shared_ptr pelos primeiros e segundos ponteiros
cout<<"p2 pointing to "<< p2.use_count() <<" object(s).\n";
cout<<"p1 pointing to "<< p1.use_count() <<" object(s).\n";
// Remova a propriedade do primeiro ponteiro do objeto Shared_Ptr
P1.reiniciar();
// exibe o número de objetos shared_ptr pelo segundo ponteiro
cout<<"p2 pointing to "<< p2.use_count() <<" object(s).\n";
return0;

Saída:

A saída a seguir aparecerá após a execução do código acima. O primeiro ponteiro, P1, está apontando para um objeto após a criação. Depois de criar o segundo ponteiro, P2, Usando o primeiro ponteiro, P1, Ambos os ponteiros estão apontando para dois objetos para compartilhar o ponteiro. Depois de chamar a função RESET () para o ponteiro, P1, Um objeto foi destruído e o ponteiro, P2, agora está apontando apenas para um objeto.

Conclusão:

Os propósitos de usar um ponteiro compartilhado em C ++ foram explicados neste tutorial usando exemplos simples. Criação de ponteiros compartilhados de maneiras diferentes, localização de ponteiro compartilhado armazenado e contando o número de objetos apontados pelos ponteiros compartilhados. Espero que os codificadores C ++ possam usar o ponteiro compartilhado em seu código depois de ler este tutorial.