Sobes.tech
Middle

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.