Sobes.tech
Middle

Кога операторът delete няма да бъде извикан за обект в умни указатели?

sobes.tech AI

Отговор от AI

Операторът delete за обект, управляван от интелигентен указател, няма да бъде извикан в следните случаи:

  • За std::shared_ptr: ако съществува поне още един shared_ptr, който притежава същия обект. Изтриването се случва само когато броячът на препратките достигне нула.

  • За std::weak_ptr: той не притежава обекта, а само към него се позовава, затова delete не се извиква при унищожаването на weak_ptr.

  • За std::unique_ptr: ако указателят е прехвърлен или преместен, и текущият unique_ptr вече не притежава обекта.

  • Ако интелигентният указател е създаден с персонализиран делител, който не извиква delete (например освобождава ресурса по друг начин).

Пример с std::shared_ptr:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo унищожен\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // брояч на препратки = 2
    } // sp2 се унищожава, брояч = 1, delete не се извиква
    // delete ще бъде извикан само когато и sp1 бъде унищожен
}

Тук delete ще бъде извикан само след унищожаването на последния shared_ptr.