Gerenciamento de Memória Baseado em Escopo

Construtores e destrutores permitem que o tempo de vida de um objeto seja rastreado.

Ao envolver um ponteiro em um objeto, você pode liberar memória quando o objeto é destruído. O compilador garante que isso aconteça, mesmo que uma exceção seja lançada.

Isso geralmente é chamado de aquisição de recursos é inicialização (Resource Acquisition Is Initialization, RAII) e fornece ponteiros inteligentes (smart pointers).

Exemplo em C++

void say_hello(std::unique_ptr<Person> person) {
  std::cout << "Olá " << person->name << std::endl;
}
  • O objeto std::unique_ptr é alocado na pilha e aponta para memória alocada no heap.
  • No final de diga_ola, o destrutor std::unique_ptr será executado.
  • O destrutor libera o objeto Pessoa para o qual ele aponta.

Construtores especiais de movimento (move) são usados ao passar o “ownership” para uma função:

std::unique_ptr<Person> person = find_person("Carla");
say_hello(std::move(person));