Middle
Ποιος δείκτης χρησιμοποιείται μαζί με το shared_ptr;
sobes.tech AI
Απάντηση από AI
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Δημιουργία shared_ptr
std::weak_ptr<int> weak = shared; // Δημιουργία weak_ptr από shared_ptr
if (auto locked = weak.lock()) { // Προσπάθεια λήψης shared_ptr από weak_ptr
std::cout << "Τιμή: " << *locked << std::endl;
} else {
std::cout << "Το αντικείμενο διαγράφηκε." << std::endl;
}
shared.reset(); // Το αντικείμενο που δείχνει το shared_ptr διαγράφεται
if (auto locked = weak.lock()) { // Δεύτερη προσπάθεια, το αντικείμενο έχει ήδη διαγραφεί
std::cout << "Τιμή: " << *locked << std::endl;
} else {
std::cout << "Το αντικείμενο διαγράφηκε." << std::endl;
}
return 0;
}
Το weak_ptr σε συνδυασμό με το shared_ptr χρησιμοποιείται για την επίλυση προβλημάτων κυκλικών αναφορών και την αποτροπή "μνήμης διαρροής" όταν δύο ή περισσότερα αντικείμενα που διαχειρίζονται από το shared_ptr αναφέρονται το ένα στο άλλο, και οι μετρητές αναφορών ποτέ δεν φτάνουν το μηδέν.
Ακολουθούν τα βασικά χαρακτηριστικά του weak_ptr:
- Δεν αυξάνει τον μετρητή αναφορών: Το
weak_ptrδιατηρεί μια "αδύναμη" αναφορά στο αντικείμενο που διαχειρίζεται τοshared_ptr, χωρίς να αυξάνει τον μετρητή ισχυρών αναφορών. - Έλεγχος ζωής αντικειμένου: Με τη μέθοδο
lock(), μπορεί να προσπαθήσει να πάρει έναshared_ptrαπό τοweak_ptr. Αν το αντικείμενο είναι ακόμα ζωντανό, ηlock()θα επιστρέψει ένα έγκυροshared_ptr; διαφορετικά, ένα κενόshared_ptr. - Χωρίς άμεση πρόσβαση: Το
weak_ptrδεν παρέχει άμεση πρόσβαση στο περιεχόμενο του αντικειμένου μέσω των τελεστών*ή->. Η πρόσβαση είναι δυνατή μόνο μετά από επιτυχημένη κλήσηlock().
Η χρήση του weak_ptr είναι ένας τυπικός τρόπος να σπάσει κανείς τους κύκλους αναφορών σε δομές δεδομένων που χρησιμοποιούν shared_ptr, όπως γράφοι ή διπλές συνδεδεμένες λίστες.