რა არის გამყოფების როლი ჭკვიან ინდიკატორებში?
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-дин тиби көрсөткүчтүн тибинин бөлүгү эмес, бул көбүрөөк ийкемдүүлүк камсыздайт.