Sobes.tech
Middle

Акылдуу көрсөткүчтөрдөгү бөлгүчтөрдүн ролу кандай?

sobes.tech AI

AIден жооп

Акылдуу көрсөткүчтөрдөгү (smart pointers) deleterлер, акылдуу көрсөткүч көрсөтүп жаткан ресурсты бошотуу үчүн ылайыкташтырылган логиканы аныктоого мүмкүндүк берет. Стандарттык түрдө, std::unique_ptr delete колдонот, ал эми std::shared_ptr delete же delete[] колдонот. Deleter функция, funktor же lambda билдирүүсү болушу мүмкүн.

Мисалдар:

std::unique_ptr менен функция deleter:

#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 менен lambda deleter:

#include <iostream>
#include <memory>

// ...
// auto resource_deleter = [](int* p){ std::cout << "Ресурсту өчүрүү\n"; delete p; };
// std::unique_ptr<int, decltype(resource_deleter)> ptr(new int(10), resource_deleter);
// ...

std::shared_ptr менен lambda deleter:

#include <iostream>
#include <memory>

// ...
// std::shared_ptr<int> shared_ptr_with_deleter(new int(20), [](int* p){ std::cout << "Бөлүштүрүлгөн ресурсту өчүрүү\n"; delete p; });
// ...

Deleterлердин ролу төмөнкү сценарийлерде маанилүү:

  • Мемориядан тышкары ресурстарды башкаруу: Файлдар, тармак сокеттери, маалымат базасынын иштеткичтери ж.б.
  • Меморияны бошотуу процесси үчүн конфигурациялоо: Мисалы, массивдер үчүн delete[] колдонуу же объекттердин пулу.
  • Өзгөчө логика бошотуу учурунда: Журнал жүргүзүү, байланышкан структураларды тазалоо.

std::unique_ptr үчүн, deleterдин тиби көрсөткүчтүн тибинин бир бөлүгү болуп саналат, бул полиморфизм менен иштөөнү кыйындатышы мүмкүн. std::shared_ptr үчүн, deleterдин тиби көрсөткүчтүн тибинин бөлүгү эмес, бул көбүрөөк ийкемдүүлүк камсыздайт.