Sobes.tech
Middle

Jaká je role oddělovačů v chytrých ukazatelích?

sobes.tech AI

Odpověď od AI

Deleter (deleters) v chytrých ukazatelích umožňují definovat vlastní logiku pro uvolnění zdroje, na který ukazuje chytrý ukazatel. Ve výchozím nastavení std::unique_ptr používá delete, a std::shared_ptr používá delete nebo delete[]. Deleter může být funkce, funktor nebo lambda výraz.

Příklady:

std::unique_ptr s funkcí-deleterem:

#include <cstdio> // Pro 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 s lambda-deleterem:

#include <iostream>
#include <memory>

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

std::shared_ptr s lambda-deleterem:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Uvolnění sdíleného zdroje\n"; delete p; });
// ...

Role deleterů je důležitá v následujících scénářích:

  • Správa zdrojů mimo paměť: Soubory, síťové sockety, správci databází atd.
  • Nastavení procesu uvolnění paměti: Například použití delete[] pro pole nebo objekty v poolu.
  • Další logika při uvolnění: Logování, čištění souvisejících struktur.

Pro std::unique_ptr je typ deleteru součástí typu ukazatele, což může ztížit práci s polymorfismem. Pro std::shared_ptr typ deleteru není součástí typu ukazatele, což zajišťuje větší flexibilitu.