Wanneer wordt de delete-operator niet aangeroepen voor een object in slimme pointers?
sobes.tech AI
Antwoord van AI
De delete-operatie voor een door een slimme pointer beheerd object wordt niet aangeroepen in de volgende gevallen:
-
Voor
std::shared_ptr: als er minstens een andereshared_ptrbestaat die hetzelfde object bezit. Verwijdering gebeurt alleen wanneer de referentieteller op nul staat. -
Voor
std::weak_ptr: het bezit het object niet, maar verwijst er alleen naar, dusdeletewordt niet aangeroepen bij het vernietigen van deweak_ptr. -
Voor
std::unique_ptr: als de pointer is overgedragen of verplaatst, en de huidigeunique_ptrhet object niet meer bezit. -
Als de slimme pointer is gemaakt met een aangepaste deleter die
deleteniet aanroept (bijvoorbeeld, de resource op een andere manier vrijmaakt).
Voorbeeld met std::shared_ptr:
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo verwijderd\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // referentieteller = 2
} // sp2 wordt vernietigd, teller = 1, delete wordt niet aangeroepen
// delete wordt alleen aangeroepen wanneer sp1 ook wordt vernietigd
}
Hier wordt delete alleen aangeroepen nadat de laatste shared_ptr is vernietigd.