Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Alocação Dinâmica de Memória | Introdução a Ponteiros Inteligentes
C++ Smart Pointers
course content

Conteúdo do Curso

C++ Smart Pointers

C++ Smart Pointers

1. Introdução a Ponteiros Inteligentes
2. Ponteiros Únicos
3. Ponteiros Compartilhados
4. Ponteiros Fracos
5. Tópicos Avançados

book
Alocação Dinâmica de Memória

Existem dois tipos de memória disponíveis para uso: stack e heap. A memória stack é limitada em tamanho e é bem adequada para variáveis pequenas e de curta duração que não são necessárias além de seu escopo. Quando uma variável armazenada na stack sai do escopo, ela é automaticamente destruída.

h

stack_allocated

copy
12
// Creates an integer variable on the stack int stack_int = 42;

No entanto, quando você precisa de memória que persista além de seu escopo ou que requeira mais espaço, você recorre ao heap. O heap é um pool de memória muito maior onde seu programa pode solicitar memória em tempo de execução. Isso é tipicamente feito usando a palavra-chave new:

h

heap_allocated

copy
12
// create an integer on the heap int* heap_int = new int;

A questão complicada sobre a memória heap é que ela não é liberada automaticamente. É responsabilidade do desenvolvedor desalocá-la quando terminar. Para cada new, deve haver um delete correspondente.

h

free_pointer

copy
12
// Explicitly deletes the integer on the heap delete heap_int;

Vazamentos de Memória

Quando você introduz ponteiros no seu código, você entra no reino da gestão manual de memória. A gestão manual de memória requer que você libere a memória quando ela não é mais necessária. Isso pode levar a armadilhas comuns: vazamentos de memória e ponteiros pendentes.

Vazamentos de memória geralmente ocorrem quando você esquece de desalocar a memória. Essa memória permanece reservada, fazendo com que seu programa perca memória ao longo do tempo.

h

memory_leak

copy
12345
running = true while (running) { int* p_int = new int; }

Ponteiros Pendentes

Ponteiros pendentes ocorrem quando um ponteiro continua apontando para uma memória que foi desalocada. É como ter um mapa do tesouro que leva você a um lugar (endereço de memória) onde o tesouro (dados) já foi retirado (destruído).

cpp

main

copy
12345678910111213
#include <iostream> int main() { int* ptr = new int; // dynamically allocate an integer *ptr = 42; // assign a value to the allocated memory std::cout << *ptr << std::endl; // This will output 42 delete ptr; // deallocate the memory std::cout << *ptr << std::endl; // ptr is a dangling pointer! }

Tentando acessar um ponteiro após chamar delete nele, o que desaloca a memória para a qual ele estava apontando. Após a exclusão, o ponteiro se torna um ponteiro pendente, pois ainda mantém o endereço de uma memória que não existe mais.

Acessar um ponteiro pendente pode levar a um comportamento imprevisível ou até mesmo a falhas, já que a memória para a qual ele aponta não é mais válida.

question mark

O seguinte código tem um vazamento de memória?

Selecione a resposta correta

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 2
We're sorry to hear that something went wrong. What happened?
some-alt