Middle
shared_ptr менен кайсы көрсөткүч колдонулат?
sobes.tech AI
AIден жооп
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Орноштуруу shared_ptr
std::weak_ptr<int> weak = shared; // shared_ptr'дон weak_ptr түзүү
if (auto locked = weak.lock()) { // weak_ptr'дон shared_ptr алуу аракетин көрүү
std::cout << "Кийим: " << *locked << std::endl;
} else {
std::cout << "Объект өчүрүлгөн." << std::endl;
}
shared.reset(); // shared_ptr көрсөтүп турган объект өчүрүлөт
if (auto locked = weak.lock()) { // Экинчи аракет, объект азыр өчүрүлгөн
std::cout << "Кийим: " << *locked << std::endl;
} else {
std::cout << "Объект өчүрүлгөн." << std::endl;
}
return 0;
}
weak_ptr менен shared_ptr биргелешип колдонулуп, циклик шилтемелер маселесин чечет жана эскерүүлөрдү алдын алат, эгерде эки же андан көп объект shared_ptr менен башкарылса жана бири-бирине шилтеме кылса, жана шилтемелердин санагычтары нөлгө жетпесе.
Негизги weak_ptr өзгөчөлүктөрү:
- Күчтүү шилтемелер санын көбөйтпөйт:
weak_ptrshared_ptrтарабынан башкарылуучу объектке "слабую" шилтемени сактайт, анын күчтүү шилтемелер санын көбөйтпөйт. - Объекттин жашоо мөөнөтүн текшерүү:
lock()методу аркылууweak_ptr'донshared_ptrалуу аракетин жасоого болот. Эгер объект дагы жаш болсо,lock()жарактууshared_ptrкайтарат; эгер жок болсо, бошshared_ptrкайтарат. - Түздөн-түз кирүү жок:
weak_ptr*же->операторлору аркылуу объекттин мазмунуна түздөн-түз кирүүнү камсыз кылбайт. Кирүү ганаlock()ийгиликтүү чакырылганда мүмкүн.
weak_ptr колдонуу — бул shared_ptr колдонгон структураларда шилтемелер циклин үзүү үчүн стандарттык ыкма, мисалы графтарда же эки тараптуу тизмектерде.