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.