Ponteiro inteligente em C ++

Ponteiro inteligente em C ++
Smart Pointer é um conceito muito importante introduzido em C++. O ponteiro inteligente é usado em C ++ para resolver o problema de usar o ponteiro normal. Para remover as desvantagens do ponteiro normal, existe um ponteiro inteligente no C++.

Ponteiro inteligente vs ponteiro regular

Os dois principais problemas de usar ponteiros regulares são:

a. O ponteiro regular não pode gerenciar a utilização de memória com eficiência.

b. Não pode liberar o objeto de memória quando eles não são usados ​​no programa.

c. Como o ponteiro normal não pode alocar a memória do objeto, se o ponteiro for removido do programa, o endereço do objeto de memória que é apontado pelo ponteiro não é encontrado. Como resultado, vazamento de memória acontece.

Para isso, usamos o ponteiro inteligente sobre o ponteiro comum. As vantagens dos indicadores inteligentes sobre os ponteiros regulares são:

a. Ele gerencia a memória automaticamente.

b. Ele liberou a memória do objeto quando eles não são usados ​​no programa.

c. Ele aloca a memória do objeto quando o ponteiro sai do escopo do programa.

d. O ponteiro inteligente é usado em C ++ para alocar os objetos, atravessar os diferentes tipos de estrutura de dados e gerencia diferentes tipos de expressão de lambda para passar dentro da função.

e. Torna nosso programa muito seguro e seguro. Como resultado, o programa se torna muito simples de entender e se tornar mais fácil de depurar.

Diferentes tipos de ponteiros inteligentes

Normalmente, existem três tipos de ponteiros inteligentes disponíveis em C++. Eles são:

a. Exclusivo

b. Compartilhado

c. Fraco.

Discutiremos cada um deles abaixo.

a. Ponteiro único

a. Ponteiro exclusivo segura um ponteiro para um objeto. Ele libera a memória do objeto quando ele sai do escopo.

b. Uma das características únicas do ponteiro único é que existe apenas uma cópia de um objeto presente na memória. Nenhum outro recurso pode apontar para esse objeto em particular.

c. Se muitos recursos estiverem disponíveis para um objeto no código, ocorre um erro de tempo de compilação.

Exemplo de programação 1:

#incluir
#incluir
usando namespace std;
classe quadrada
lado int;
público:
Quadrado (int s)

lado = s;

Int Area ()

retornar (lado*lado);

;
int main ()

exclusivo_ptr p1 (novo quadrado (2));
cout< area () <retornar 0;

Saída:

Explicação:

Aqui, criamos uma classe chamada Square. Dentro da classe, um lado variável é declarado e chama o construtor para inicializar o valor da variável lateral. Agora, definimos uma função denominada área que retorna o valor de sua área.

Dentro da função Main (), declaramos um ponteiro único chamado exclusivo_ptr. Agora, criamos um ponteiro P1 que aponta o objeto do quadrado da classe e dentro de seus parênteses, passamos um valor 2.

Agora, se imprimirmos a área através do ponteiro P1 como P1-> Area (), mostra que a área do quadrado é 4.

b. Ponteiro compartilhado

a. O ponteiro compartilhado pode ser aplicado no programa quando queremos atribuir um ponteiro a vários recursos do objeto.

b. Ponteiro compartilhado é um endereço gerado por contagem inteligente, que pode ser usada para armazenar e passar uma referência além do escopo de uma função.

c. É muito útil no OOP (programa orientado a objetos). Para armazenar um ponteiro como variável de membro, o ponteiro compartilhado é usado.

d. O ponteiro compartilhado não será excluído até que todos os recursos tenham concluído sua tarefa.

Exemplo de programação 2:

#incluir
#incluir
usando namespace std;
classe quadrada
lado int;
público:
Quadrado (int s)

lado = s;

Int Area ()

retornar (lado*lado);

;
int main ()

shared_ptrp1 (novo quadrado (2));
// introduzindo ponteiro compartilhado;
shared_ptrp2;
P2 = p1;
coutcoutretornar 0;

Saída:

Explicação:

Este exemplo de programação 2 é a continuação do exemplo de programação 1. Dentro da função Main (), introduzimos o ponteiro compartilhado. Usando o ponteiro P1, criamos o objeto da classe quadrada. O mesmo objeto é apontado pelo valor P2-> Area () e P1-> Area (). Ambos mostram a área do quadrado é 4.

c. Ponteiro fraco

a. Ponteiro fraco é um caso especial de ponteiro para ser usado com os ponteiros compartilhados.

b. Ponteiro fraco tem instalação para acessar um objeto de propriedade de uma ou mais instância de ponteiro compartilhado.

c. Não faz parte da contagem de referência.

d. Usamos o ponteiro fraco no programa quando queremos observar um objeto, mas não exigem que ele permaneça vivo.

Exemplo de programação 3:

#incluir
#incluir
usando namespace std;
classe quadrada
lado int;
público:
Quadrado (int s)

lado = s;

Int Area ()

retornar (lado*lado);

;
int main ()

shared_ptrp1 (novo quadrado (2));
fracos_ptrw1;
fracos_ptr w2 (w1);
fracos_ptr w3 (p1);
cout<< "w1:" << w1.use_count()<cout<< "w2:" << w2.use_count()<cout<< "w3:" << w3.use_count()<retornar 0;

Saída:

Explicação:

Este Exemplo de Programação 3 é a continuação do Exemplo de Programação 2. Aqui, introduzimos um ponteiro compartilhado chamado shared_ptr e criamos um ponteiro P1 para apontar o objeto da classe quadrada. Agora usamos o ponteiro fraco, fracos_ptr, que aponta W1 e W2. Dentro do W2, passamos W1. Criamos outro ponteiro fraco w3 onde passamos o ponteiro P1.

Agora, se imprimirmos todo o W1.use_count () e w2.use_count (), o resultado será exibido.

Conclusão

Ao discutir sobre o conceito e os usos do ponteiro inteligente em detalhes, chegamos a essa conclusão de que o ponteiro inteligente é introduzido em C ++ para remover as desvantagens do ponteiro normal. Através do ponteiro inteligente, podemos gerenciar diferentes tipos de proprietários e recursos do objeto com muita eficiência. Esperamos que este artigo seja útil. Confira outros artigos de dica do Linux para obter mais dicas e tutoriais.