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ść.