Middle
766
Kako funkcioniše shared_ptr u C++?
Одговор од АИ
sobes.tech АИ
shared_ptr — то је паметан показивач који реализује семантику делјеног ресурса. Он чува показивач на објекат и показивач на управљачки блок.
Управљачки блок садржи:
- Бројач јаких референци (reference count).
- Бројач слабих референци (weak count).
- Кориснички функцонер за брисање (deleter), ако је задат.
- Кориснички аллокатор, ако је задат.
- Показивач на чувани објекат (исто што и у самом
shared_ptr).
Принцип рада:
- Креирање: При креирању првог
shared_ptr, који указује на објекат, креира се управљачки блок, бројачи референци се инициализују: јаке — 1, слабе — 0.std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Креира објекат int и управљачки блок - Копирање: При копирању
shared_ptrбројач јаке референце у управљачком блоку се повећава за 1.std::shared_ptr<int> ptr2 = ptr1; // Повећава бројач јаке референце - Додељивање: При додељивању
shared_ptrстаром ресурсу, decrement-ује се (смањује) бројач јаке референце, а новом ресурсу increment-ује (повећава).std::shared_ptr<int> ptr3; ptr3 = ptr1; // Decrement старог ресурса, Increment новог - Уклањање: При уништавању
shared_ptr(нпр. излазак из области видљивости) бројач јаке референце се decrement-ује.{ std::shared_ptr<int> ptr4 = ptr1; // Повећава бројач јаке референце // ptr4 излази из области видљивости } // Decrement бројача јаке референце - Освобађање ресурса: Када бројач јаке референце достигне нулу, ресурс (објекат на који указује
shared_ptr) се брише коришћењем задатог функтора за брисање (илиdeleteпо подразумеваној вредности). - Освобађање управљачког блока: Управљачки блок се ослобађа када оба бројача (јаке и слабе) достигну нулу.
Предности:
- Аутоматско управљање меморијом за делјене ресурсе.
- Безбедност од двоструког ослобађања.
- Подршка корисничким функтора за брисање.
Недостаци:
- Цикличне референце могу довести до цурења меморије (решава се помоћу
weak_ptr). - Мало повећање трошкова због управљачког блока и атомарних операција са бројачима.
- Потокобезбедност операција са самим
shared_ptr(копирање, додељивање, промена унутрашњег показивача), али не и са објектом, на који указује.