Sobes.tech
Middle
766

Kako funkcioniše shared_ptr u C++?

Одговор од АИ

sobes.tech АИ

shared_ptr — то је паметан показивач који реализује семантику делјеног ресурса. Он чува показивач на објекат и показивач на управљачки блок.

Управљачки блок садржи:

  • Бројач јаких референци (reference count).
  • Бројач слабих референци (weak count).
  • Кориснички функцонер за брисање (deleter), ако је задат.
  • Кориснички аллокатор, ако је задат.
  • Показивач на чувани објекат (исто што и у самом shared_ptr).

Принцип рада:

  1. Креирање: При креирању првог shared_ptr, који указује на објекат, креира се управљачки блок, бројачи референци се инициализују: јаке — 1, слабе — 0.
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Креира објекат int и управљачки блок
    
  2. Копирање: При копирању shared_ptr бројач јаке референце у управљачком блоку се повећава за 1.
    std::shared_ptr<int> ptr2 = ptr1; // Повећава бројач јаке референце
    
  3. Додељивање: При додељивању shared_ptr старом ресурсу, decrement-ује се (смањује) бројач јаке референце, а новом ресурсу increment-ује (повећава).
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // Decrement старог ресурса, Increment новог
    
  4. Уклањање: При уништавању shared_ptr (нпр. излазак из области видљивости) бројач јаке референце се decrement-ује.
    {
        std::shared_ptr<int> ptr4 = ptr1; // Повећава бројач јаке референце
        // ptr4 излази из области видљивости
    } // Decrement бројача јаке референце
    
  5. Освобађање ресурса: Када бројач јаке референце достигне нулу, ресурс (објекат на који указује shared_ptr) се брише коришћењем задатог функтора за брисање (или delete по подразумеваној вредности).
  6. Освобађање управљачког блока: Управљачки блок се ослобађа када оба бројача (јаке и слабе) достигну нулу.

Предности:

  • Аутоматско управљање меморијом за делјене ресурсе.
  • Безбедност од двоструког ослобађања.
  • Подршка корисничким функтора за брисање.

Недостаци:

  • Цикличне референце могу довести до цурења меморије (решава се помоћу weak_ptr).
  • Мало повећање трошкова због управљачког блока и атомарних операција са бројачима.
  • Потокобезбедност операција са самим shared_ptr (копирање, додељивање, промена унутрашњег показивача), али не и са објектом, на који указује.