Sobes.tech
Middle

Kad izklaidējošajos norādītājos netiks izsaukts delete operators priekš objekta?

sobes.tech AI

Atbilde no AI

Inteliģentā rādītāja pārvaldītam objektam delete operācija netiks izsaukta šādos gadījumos:

  • std::shared_ptr gadījumā: ja ir vismaz viens cits shared_ptr, kas pieder tam pašam objektam. Dzēšana notiek tikai tad, kad atsauču skaits sasniedz nulli.

  • std::weak_ptr gadījumā: tas nepieder objektam, tikai to norāda, tāpēc delete netiek izsaukts weak_ptr iznīcināšanas brīdī.

  • std::unique_ptr gadījumā: ja rādītājs ir pārnests vai pārvietots, un pašreizējais unique_ptr vairs nepieder objektam.

  • Ja inteliģentais rādītājs ir izveidots ar pielāgotu deleteri, kas neizsauc delete (piemēram, resursu atbrīvo citādi).

Piemērs ar std::shared_ptr:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo iznīcināts\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // atsauču skaits = 2
    } // sp2 tiek iznīcināts, atsauču skaits = 1, delete netiek izsaukts
    // delete tiks izsaukts tikai tad, kad arī sp1 tiks iznīcināts
}

Šeit delete tiks izsaukts tikai pēc pēdējā shared_ptr iznīcināšanas.