Sobes.tech
Middle

Jaka jest rola separatorów w inteligentnych wskaźnikach?

sobes.tech AI

Odpowiedź od AI

Delimity (deleters) w inteligentnych wskaźnikach pozwalają zdefiniować niestandardową logikę zwalniania zasobu, na który wskazuje wskaźnik. Domyślnie std::unique_ptr używa delete, a std::shared_ptr używa delete lub delete[]. Delimiter może być funkcją, funktorem lub wyrażeniem lambda.

Przykłady:

std::unique_ptr z funkcją-deleterem:

#include <cstdio> // Dla 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 z deleterem lambda:

#include <iostream>
#include <memory>

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

std::shared_ptr z deleterem lambda:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Usuwanie zasobu współdzielonego\n"; delete p; });
// ...

Rola deleterów jest istotna w następujących scenariuszach:

  • Zarządzanie zasobami innymi niż pamięć: Pliki, gniazda sieciowe, obsługiwacze baz danych itp.
  • Konfiguracja procesu zwalniania pamięci: Na przykład użycie delete[] dla tablic lub puli obiektów.
  • Dodatkowa logika przy zwalnianiu: Rejestrowanie, czyszczenie powiązanych struktur.

Dla std::unique_ptr, typ deletera jest częścią typu wskaźnika, co może utrudniać pracę z polimorfizmem. Dla std::shared_ptr, typ deletera nie jest częścią typu wskaźnika, co zapewnia większą elastyczność.