Sobes.tech
Middle

Koja je uloga delimitera u pametnim pokazivačima?

sobes.tech АИ

Одговор од АИ

Делитери (deleters) u pametnih pokazivača omogućavaju definisanje prilagođene logike za oslobađanje resursa na koji pokazuje pametni pokazivač. Podrazumevano, std::unique_ptr koristi delete, a std::shared_ptr koristi delete ili delete[]. Deleter može biti funkcija, funktor ili lambda izraz.

Primeri:

std::unique_ptr sa funkcijskim deleterom:

#include <cstdio> // Za 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 sa lambda deleterom:

#include <iostream>
#include <memory>

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

std::shared_ptr sa lambda deleterom:

#include <iostream>
#include <memory>

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

Uloga deletera je važna u sledećim scenarijima:

  • Upravljanje resursima van memorije: Fajlovi, mrežni soketi, upravljači baza podataka itd.
  • Podešavanje procesa oslobađanja memorije: Na primer, korišćenje delete[] za nizove ili objekte u poolu.
  • Dodatna logika pri oslobađanju: Logovanje, čišćenje povezanih struktura.

Za std::unique_ptr, tip deletera je deo tipa pokazivača, što može otežati rad sa polimorfizmom. Za std::shared_ptr, tip deletera nije deo tipa pokazivača, što pruža veću fleksibilnost.