Πότε δεν θα κληθεί ο χειριστής delete για ένα αντικείμενο σε έξυπνους δείκτες;
sobes.tech AI
Απάντηση από AI
Η εντολή delete για ένα αντικείμενο που διαχειρίζεται ένας έξυπνος δείκτης δεν θα κληθεί στις ακόλουθες περιπτώσεις:
-
Για
std::shared_ptr: αν υπάρχει τουλάχιστον ένας άλλοςshared_ptrπου κατέχει το ίδιο αντικείμενο. Η διαγραφή συμβαίνει μόνο όταν ο μετρητής αναφορών φτάσει στο μηδέν. -
Για
std::weak_ptr: δεν κατέχει το αντικείμενο, απλώς αναφέρεται σε αυτό, επομένως τοdeleteδεν καλείται κατά την καταστροφή τουweak_ptr. -
Για
std::unique_ptr: αν ο δείκτης έχει μεταφερθεί ή μετακινηθεί, και ο τρέχωνunique_ptrδεν κατέχει πλέον το αντικείμενο. -
Αν ο έξυπνος δείκτης δημιουργήθηκε με έναν προσαρμοσμένο deleter που δεν καλεί
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.