Sobes.tech
Middle

Πότε δεν θα κληθεί ο χειριστής 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.