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_ptrgadījumā: ja ir vismaz viens citsshared_ptr, kas pieder tam pašam objektam. Dzēšana notiek tikai tad, kad atsauču skaits sasniedz nulli. -
std::weak_ptrgadījumā: tas nepieder objektam, tikai to norāda, tāpēcdeletenetiek izsauktsweak_ptriznīcināšanas brīdī. -
std::unique_ptrgadījumā: ja rādītājs ir pārnests vai pārvietots, un pašreizējaisunique_ptrvairs 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.