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_ptrpuhul: kui on vähemalt üks teineshared_ptr, mis omab sama objekti. Kustutamine toimub ainult siis, kui viidete arv jõuab nullini. -
std::weak_ptrpuhul: see ei omanda objekti, vaid viitab sellele, seegadeleteei kutsuta väljaweak_ptrhävitamisel. -
std::unique_ptrpuhul: kui näitaja on üleantud või teisaldatud ning praeguneunique_ptrei 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.