Sobes.tech
Middle

Aká je úloha oddeľovačov v inteligentných ukazovateľoch?

sobes.tech AI

Odpoveď od AI

Deleteri (deleters) v chytrých ukazovateľoch umožňujú definovať vlastnú logiku na uvoľnenie zdroja, na ktorý ukazuje chytrý ukazovateľ. Predvolene std::unique_ptr používa delete, a std::shared_ptr používa delete alebo delete[]. Deleter môže byť funkcia, funktor alebo lambda výraz.

Príklady:

std::unique_ptr s funkciou-deleterom:

#include <cstdio> // Pre 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-deleterom:

#include <iostream>
#include <memory>

// ...
// auto resource_deleter = [](int* p){ std::cout << "Uvoľňovanie zdroja\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...

std::shared_ptr s lambda-deleterom:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Uvoľňovanie zdieľaného zdroja\n"; delete p; });
// ...

Rola deleterov je dôležitá v nasledujúcich scenároch:

  • Správa zdrojov mimo pamäte: Súbory, sieťové sokety, správci databáz atď.
  • Nastavenie procesu uvoľnenia pamäte: Napríklad použitie delete[] pre polia alebo objekty v pooli.
  • Pridanie ďalšej logiky pri uvoľnení: Logovanie, čistenie súvisiacich štruktúr.

Pre std::unique_ptr je typ deletera súčasťou typu ukazovateľa, čo môže sťažiť prácu s polymorfizmom. Pre std::shared_ptr nie je typ deletera súčasťou typu ukazovateľa, čo poskytuje väčšiu flexibilitu.