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 contador de referência compartilhada conta o número de proprietários. o shared_ptr aumenta o contador de referência em um após copiar o objeto e diminui o contador de referência em um após destruir o objeto. A memória pertencente ao objeto é realocada se o objeto pertencente ao último shared_ptr é destruído, ou o Redefinir() 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: Declarar 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 foi declarada no código. O construtor imprimirá uma mensagem quando um novo objeto compartilhado for criado com o construtor. o Exibição() método imprimirá 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 foi criado atribuindo o primeiro ponteiro compartilhado. o Exibição() método foi chamado três vezes usando três objetos de ponteiro compartilhados.







// Incluir bibliotecas necessárias

#incluir

#incluir

usingnamespacestd;

// Defina a classe
classMyClass{
público:
// Declare o construtor
Minha classe() {
custo<<'O construtor é chamado. n';
}
// Declara um método para imprimir texto
voidDisplay(string str)
{
custo<<'O método Display () é chamado a partir do'<<p<<'ponteiro. n';
}
};

intmain()
{
// Inicialize shared_ptr sem chamar o construtor
shared_ptr p1=make_shared();
p1->Exibição('primeiro');
// Inicialize shared_ptr chamando construtor
shared_ptr p2=shared_ptr(newMyClass);
p2->Exibição('segundo');

// Inicializar shared_ptr por atribuição
shared_ptr p3=p1;
p3->Exibição('terceiro');
return0;
}

Saída:



A seguinte saída aparecerá após a execução do código acima. O construtor chamou apenas no momento da criação do segundo objeto. Portanto, a mensagem do construtor foi impressa apenas uma vez:







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

O ponteiro compartilhado da função get () é usado para retornar a localização 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 classe 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 a localização do ponteiro compartilhado usando a função get (). Nesse 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 atribuindo o primeiro ponteiro.

// Incluir bibliotecas necessárias

#incluir

#incluir

usingnamespacestd;

// Defina a classe
classMyClass
{
público:
// Declare o construtor
Minha classe() {
custo<<'O construtor é chamado. n';
}
};
// Defina a função para inicializar o ponteiro
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
custo<<p2.pegue() <<' n';
}

intmain()
{
// Inicialize shared_ptr chamando construtor
shared_ptr p1=shared_ptr(newMyClass);
custo<<p1.pegue() <<' n';

// Inicialize shared_ptr chamando a função
Init_shared_ptr();

// Inicializar shared_ptr por atribuição
shared_ptr p3=p1;
custo<<p3.pegue() <<' n';
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: contar os objetos de ponteiro compartilhados

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 classe 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 impresso posteriormente.

// Incluir bibliotecas necessárias

#incluir

#incluir

usingnamespacestd;
// Defina a classe
classMyClass{
público:
// Declare o construtor
Minha classe() {
custo<<'O construtor é chamado. n';
}
};
intmain()
{
// Inicialize o primeiro shared_ptr chamando o construtor
shared_ptr p1(newMyClass);

// Mostra o número de objetos shared_ptr pelo primeiro ponteiro
custo<<'p1 apontando para'<<p1.use_count() <<'objeto (s). n';
// Inicialize o segundo shared_ptr usando o primeiro shared_ptr
shared_ptr p2(p1);
// Mostra o número de objetos shared_ptr pelo primeiro e segundo ponteiros
custo<<'p2 apontando para'<<p2.use_count() <<'objeto (s). n';
custo<<'p1 apontando para'<<p1.use_count() <<'objeto (s). n';
// Remova a propriedade do primeiro ponteiro do objeto shared_ptr
p1.Redefinir();
// Mostra o número de objetos shared_ptr pelo segundo ponteiro
custo<<'p2 apontando para'<<p2.use_count() <<'objeto (s). n';
return0;
}

Saída:

A seguinte saída 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 apontam 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 para apenas um objeto.

Conclusão:

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