Sobes.tech
Middle

Ağıllı göstəricilərdə delimitatorlar nə üçün istifadə olunur?

sobes.tech Süni İntellekt

AI-dan cavab

Ağıllı göstəricilərdə (məsələn, std::unique_ptr, std::shared_ptr) destructorlar istifadəçi tərəfindən təyin olunan funksiya və ya obyektin çağırılması üçün istifadə olunur, bu funksiya və ya obyekt göstərici tərəfindən idarə olunan resursu sərbəst buraxmaq üçün çağırılır və standart delete operatoru yerinə keçir.

Tipik istifadə halları:

  • Heap xaricində resursların idarə olunması: new istifadə etmədən ayrılmış resursların sərbəst buraxılması (məsələn, fayllar üçün fclose, WinAPI handle-ləri, yaddaş resursları mallocfree ilə).
  • Xüsusi sərbəst buraxma ilə resurslar: Yaddaşı sərbəst buraxmadan əvvəl əlavə əməliyyatların həyata keçirilməsi və ya müəyyən obyektlər üçün xüsusi sərbəst buraxma funksiyalarının istifadə olunması.
  • C API ilə qarşılıqlı əlaqə: C kitabxanalarından alınmış göstəricilərlə işləyərkən, resursun sərbəst buraxılması üçün müəyyən funksiyanın çağırılması tələb olunur.

std::unique_ptr nümunəsi:

#include <cstdio> // fopen və fclose üçün
#include <memory> // unique_ptr üçün
#include <iostream>

// FILE* üçün istifadəçi tərəfindən təyin olunan destruktor
struct FileCloser {
    void operator()(FILE* file) const {
        if (file) {
            std::cout << "Fayl bağlanır." << std::endl;
            fclose(file);
        }
    }
};

int main() {
    // Xüsusi destruktor ilə unique_ptr yaradılması
    std::unique_ptr<FILE, FileCloser> file_ptr(fopen("nümunə.txt", "w"));

    if (file_ptr) {
        fputs("Salam, dünya!\n", file_ptr.get());
    } else {
        std::cerr << "Fayl açıla bilmədi." << std::endl;
    }

    // Fayl avtomatik olaraq main-dən çıxarkən bağlanacaq
    // FileCloser::operator() çağırışı ilə
    return 0;
}

std::shared_ptr nümunəsi:

#include <memory> // shared_ptr üçün
#include <iostream>

struct MyResource {
    MyResource() { std::cout << "MyResource yaradıldı." << std::endl; }
    ~MyResource() { std::cout << "MyResource məhv edildi." << std::endl; }
};

// Xüsusi destruktor
void custom_deleter(MyResource* ptr) {
    std::cout << "Xüsusi deleter çağırıldı." << std::endl;
    delete ptr;
}

int main() {
    // Xüsusi deleter ilə shared_ptr yaradılması
    std::shared_ptr<MyResource> res_ptr(new MyResource(), custom_deleter);

    // res_ptr məhv ediləcək və custom_deleter çağırılacaq
    return 0;
}