Sobes.tech
Middle

Kokia yra skiriamųjų vaidmuo išmaniųjų rodiklių?

sobes.tech AI

Atsakymas iš AI

Deleriai (deleters) išmaniuosiuose nuorodose leidžia nustatyti vartotojo logiką išlaisvinti išteklių, į kuriuos nurodo išmanioji nuoroda. Pagal numatytuosius nustatymus std::unique_ptr naudoja delete, o std::shared_ptrdelete arba delete[]. Deleris gali būti funkcija, funktorius arba lambda išraiška.

Pavyzdžiai:

std::unique_ptr su deleter funkcija:

#include <cstdio> // 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 su lambda deleteriu:

#include <iostream>
#include <memory>

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

std::shared_ptr su lambda deleteriu:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Deleting shared resource\n"; delete p; });
// ...

Delerių vaidmuo yra svarbus šiuose scenarijuose:

  • Išteklių valdymas, nesusijęs su atmintimi: Failai, tinklo lizdai, duomenų bazių tvarkyklės ir kt.
  • Atlaisvinimo proceso pritaikymas: Pvz., naudojant delete[] masyvams arba objektų baseinui.
  • Papildoma logika išlaisvinant: Žurnaliavimas, susijusių struktūrų valymas.

std::unique_ptr atveju, deleterio tipas yra nuorodos tipo dalis, kas gali apsunkinti polimorfizmo taikymą. std::shared_ptr atveju, deleterio tipas nėra nuorodos tipo dalis, kas užtikrina geresnį lankstumą.