τα στοιχεία επικοινωνίας μου
Ταχυδρομείο[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Το Smart Pointer είναι ένα εργαλείο σε C++ που χρησιμοποιείται για την αυτόματη διαχείριση δυναμικά εκχωρημένης μνήμης.
Είναι μια κλάση που ενσωματώνει τις λειτουργίες των ακατέργαστων δεικτών και μπορεί να χειριστεί αυτόματα την κατανομή και την αποδέσμευση πόρων, βοηθώντας έτσι τους προγραμματιστές να αποφύγουν κοινά σφάλματα διαχείρισης μνήμης, όπως διαρροές μνήμης, κρεμαστές δείκτες και άλλα προβλήματα.
Οι έξυπνοι δείκτες λειτουργούν μέσω του μηχανισμού Resource Acquisition Is Initialization (RAII), που σημαίνει ότι οι έξυπνοι δείκτες αποκτούν πόρους όταν κατασκευάζονται και απελευθερώνουν πόρους όταν καταστρέφονται. Αυτό διασφαλίζει ότι οι πόροι αποδεσμεύονται σωστά ακόμη και υπό μη φυσιολογικές συνθήκες.
(1) Διαρροή μνήμης: Η μνήμη απελευθερώνεται χειροκίνητα, αλλά μπορεί να απελευθερωθεί αυτόματα χρησιμοποιώντας έξυπνους δείκτες.
(2) Διάδοση και απελευθέρωση δεικτών κοινής ιδιοκτησίας, όπως ζητήματα καταστροφής όταν πολλά νήματα χρησιμοποιούν το ίδιο αντικείμενο.
Η τυπική βιβλιοθήκη C++ παρέχει διάφορους τύπους έξυπνων δεικτών, όπως:
std::unique_ptr
:
unique_ptr
Ένα στιγμιότυπο έχει αποκλειστική ιδιοκτησία του αντικειμένου στο οποίο υποδεικνύει.unique_ptr
Όταν ξεφεύγει από το πεδίο εφαρμογής ή γίνεται ρητά επαναφορά, καλεί αυτόματα τον καταστροφέα και απελευθερώνει το διαχειριζόμενο αντικείμενο.std::shared_ptr
:
shared_ptr
Οι περιπτώσεις μοιράζονται την ιδιοκτησία του ίδιου αντικειμένου.shared_ptr
ποσότητα.shared_ptr
Όταν ένα στιγμιότυπο ξεφεύγει από το πεδίο εφαρμογής ή γίνεται επαναφορά, το πλήθος αναφοράς μειώνεται στο μηδέν, καλείται ο καταστροφέας του αντικειμένου και το αντικείμενο απελευθερώνεται.std::weak_ptr
:
shared_ptr
πρόβλημα κυκλικής αναφοράς.shared_ptr
διαχειριζόμενα αντικείμενα, αλλά δεν συμμετέχει στη διαχείριση του κύκλου ζωής του.shared_ptr
Όταν ένα παράδειγμα δείχνει σε ένα αντικείμενο,weak_ptr
Μπορεί να ανιχνεύσει ότι το αντικείμενο έχει καταστραφεί.Ο σχεδιασμός και η χρήση έξυπνων δεικτών απλοποιεί σημαντικά τη διαχείριση της μνήμης στη C++ και βελτιώνει την ευρωστία και την ασφάλεια του προγράμματος. Στον σύγχρονο προγραμματισμό C++, συνιστάται ιδιαίτερα η χρήση έξυπνων δεικτών αντί για ακατέργαστους δείκτες για τη βελτίωση της ποιότητας και της δυνατότητας συντήρησης του κώδικα.
Οι έξυπνοι δείκτες χρησιμοποιούνται στη C++ ως μέσο για την αυτόματη διαχείριση δυναμικά εκχωρημένης μνήμης για την αποφυγή διαρροών μνήμης και άλλων ζητημάτων που σχετίζονται με τη διαχείριση πόρων.
std::unique_ptr
Παράδειγμαstd::unique_ptr
είναι ένας έξυπνος δείκτης με αποκλειστική ιδιοκτησία, που διασφαλίζει ότι υπάρχει μόνο έναςstd::unique_ptr
Ένα παράδειγμα έχει τον έλεγχο ενός δεδομένου πόρου.πότεstd::unique_ptr
Όταν ξεφεύγει από το πεδίο εφαρμογής ή γίνει επαναφορά, οι πόροι που κατέχει θα αποδεσμευτούν αυτόματα.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个unique_ptr来管理MyClass的实例
- std::unique_ptr<MyClass> uptr(new MyClass());
-
- // 调用doSomething方法
- uptr->doSomething();
-
- // unique_ptr会在离开作用域时自动调用MyClass的析构函数
- return 0;
- }
std::shared_ptr
Παράδειγμαstd::shared_ptr
είναι ένας έξυπνος δείκτης κοινής ιδιοκτησίας που επιτρέπει πολλαπλούςstd::shared_ptr
Οι παρουσίες μοιράζονται την ιδιοκτησία του ίδιου πόρου.std::shared_ptr
Χρησιμοποιήστε ένα πλήθος αναφοράς για να παρακολουθήσετε πόσοι έξυπνοι δείκτες δείχνουν προς τον ίδιο πόρο Όταν ο αριθμός αναφοράς φτάσει στο 0, ο πόρος απελευθερώνεται.
- #include <memory>
-
- class MyClass {
- public:
- MyClass() { std::cout << "MyClass constructor called.n"; }
- ~MyClass() { std::cout << "MyClass destructor called.n"; }
- void doSomething() { std::cout << "Doing something...n"; }
- };
-
- int main() {
- // 创建一个shared_ptr来管理MyClass的实例
- std::shared_ptr<MyClass> sptr(new MyClass());
-
- // 创建第二个shared_ptr,共享同一个MyClass实例
- std::shared_ptr<MyClass> sptr2 = sptr;
-
- // 调用doSomething方法
- sptr->doSomething();
-
- // 当所有shared_ptr实例都超出作用域时,MyClass的析构函数才会被调用
- return 0;
- }
Σε χρήσηstd::shared_ptr
Όταν το κάνετε αυτό, προσέξτε να αποφύγετε κυκλικές καταστάσεις αναφοράς, οι οποίες θα κάνουν το πλήθος αναφοράς να μην πέσει ποτέ στο 0, οδηγώντας σε διαρροές πόρων.Στην περίπτωση κυκλικών αναφορών, μπορείτε να χρησιμοποιήσετεstd::weak_ptr
να σπάσουμε τον κύκλο,std::weak_ptr
Δεν αυξάνει το πλήθος αναφοράς, διατηρεί μόνο τοstd::shared_ptr
Διαχειριστείτε αδύναμες αναφορές σε πόρους.
Αυτά τα παραδείγματα δείχνουν πώς να χρησιμοποιείτε έξυπνους δείκτες για τη διαχείριση δυναμικά εκχωρημένης μνήμης για να διασφαλίσετε ότι οι πόροι αποδεσμεύονται σωστά την κατάλληλη στιγμή, αποφεύγοντας κοινά λάθη που μπορεί να προκύψουν κατά τη μη αυτόματη διαχείριση της μνήμης.
https://www.cnblogs.com/god-of-death/p/17962676
https://zhuanlan.zhihu.com/p/678722914