Mi a szerepe a határolóknak az okos mutatókban?
sobes.tech MI
Válasz az MI-től
Az okos pointerekben (smart pointers) a deleterek lehetővé teszik egy egyedi logika meghatározását az erőforrás felszabadítására, amelyre az okos pointer mutat. Alapértelmezés szerint a std::unique_ptr a delete-et használja, míg a std::shared_ptr a delete vagy delete[]-t. A deleter lehet egy függvény, egy funktor vagy egy lambda kifejezés.
Példák:
std::unique_ptr függvény deleterrel:
#include <cstdio> // fclose-hoz
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 lambda deleterrel:
#include <iostream>
#include <memory>
// ...
// auto resource_deleter = [](int* p){ std::cout << "Erőforrás törlése\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...
std::shared_ptr lambda deleterrel:
#include <iostream>
#include <memory>
// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Megosztott erőforrás törlése\n"; delete p; });
// ...
A deleterek szerepe fontos a következő szcenáriókban:
- Memórián kívüli erőforrások kezelése: Fájlok, hálózati socketek, adatbázis kezelők stb.
- A memória felszabadítási folyamat konfigurálása: Például
delete[]használata tömböknél vagy objektum pooloknál. - További logika a felszabadításkor: Naplózás, kapcsolódó struktúrák tisztítása.
A std::unique_ptr esetében a deleter típusa része a pointer típusának, ami megnehezítheti a polimorfizmust. A std::shared_ptr esetében a deleter típusa nem része a pointer típusának, így nagyobb rugalmasságot biztosít.