Sobes.tech
Middle

Qual é o papel dos delimitadores nos indicadores inteligentes?

sobes.tech IA

Resposta da IA

Os delimitadores (deleters) em ponteiros inteligentes permitem definir a lógica personalizada para libertar o recurso apontado pelo ponteiro inteligente. Por padrão, std::unique_ptr usa delete, e std::shared_ptr usa delete ou delete[]. Um delimitador pode ser uma função, um functor ou uma expressão lambda.

Exemplos:

std::unique_ptr com um delimitador de função:

#include <cstdio> // Para fclose

void file_deleter(FILE* file) {
    if (file) {
        fclose(file);
    }
}

// ...
// std::unique_ptr<FILE, decltype(&file_deleter)> file_ptr(fopen("example.txt", "r"), &file_deleter);
// ...

std::unique_ptr com um delimitador lambda:

#include <iostream>
#include <memory>

// ...
// auto resource_deleter = [](int* p){ std::cout << "A eliminar recurso\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...

std::shared_ptr com um delimitador lambda:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "A eliminar recurso partilhado\n"; delete p; });
// ...

O papel dos delimitadores é importante nos seguintes cenários:

  • Gestão de recursos diferentes de memória: Ficheiros, sockets de rede, manipuladores de bases de dados, etc.
  • Configuração do processo de libertação de memória: Por exemplo, usar delete[] para arrays ou um pool de objetos.
  • Lógica adicional ao libertar: Registo, limpeza de estruturas relacionadas.

Para std::unique_ptr, o tipo do delimitador faz parte do tipo do ponteiro, o que pode complicar o trabalho com polimorfismo. Para std::shared_ptr, o tipo do delimitador não faz parte do tipo do ponteiro, o que proporciona maior flexibilidade.