Sobes.tech
Middle

Millal ei kutsuta nutikates näitajates objekti jaoks delete operaatorit?

sobes.tech AI

Vastus AI-lt

Intelligent pointeri hallatud objekti jaoks delete-i operatsioon ei kutsuta järgmistel juhtudel:

  • std::shared_ptr puhul: kui on vähemalt üks teine shared_ptr, mis omab sama objekti. Kustutamine toimub ainult siis, kui viidete arv jõuab nullini.

  • std::weak_ptr puhul: see ei omanda objekti, vaid viitab sellele, seega delete ei kutsuta välja weak_ptr hävitamisel.

  • std::unique_ptr puhul: kui näitaja on üleantud või teisaldatud ning praegune unique_ptr ei omanda enam objekti.

  • Kui nutikas näitaja on loodud kohandatud deleteri abil, mis ei kutsu delete-i (näiteks vabastab ressursi muul viisil).

Näide std::shared_ptr-iga:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo hävitatud\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // viidete arv = 2
    } // sp2 hävib, viidete arv = 1, delete ei kutsuta
    // delete kutsutakse ainult siis, kui ka sp1 hävib
}

Siin kutsutakse delete ainult pärast viimase shared_ptr hävitamist.