C ++ shared_ptr

C Shared_ptr



ο shared_ptr είναι ένας τύπος έξυπνων δεικτών του C ++ που περιέχει την κοινή ιδιοκτησία του αντικειμένου που δημιουργήθηκε από τον δείκτη. Μοιράζεται την ιδιοκτησία του αντικειμένου κατά την αποθήκευση του δείκτη σε άλλο αντικείμενο και ο κοινόχρηστος μετρητής αναφοράς μετρά τον αριθμό των κατόχων. ο shared_ptr αυξάνει τον μετρητή αναφοράς κατά ένα μετά την αντιγραφή του αντικειμένου και μειώνει τον μετρητή αναφοράς κατά ένα μετά την καταστροφή του αντικειμένου. Η μνήμη που ανήκει στο αντικείμενο ανακατανέμεται εάν το αντικείμενο ανήκει στο τελευταίο shared_ptr καταστρέφεται, ή το επαναφορά() η συνάρτηση καλείται να εκχωρήσει έναν άλλο δείκτη για το αντικείμενο. Οταν ο shared_ptr δεν κατέχει κανένα αντικείμενο, τότε ονομάζεται κενός κοινόχρηστος δείκτης. Διαφορετικές χρήσεις του shared_ptr παρουσιάστηκαν σε αυτό το σεμινάριο.

Παράδειγμα 1: Δηλώστε κοινόχρηστο δείκτη με διαφορετικούς τρόπους

Τρεις διαφορετικοί τρόποι δήλωσης κοινόχρηστου δείκτη φαίνονται στο ακόλουθο παράδειγμα. Μια κλάση με έναν κατασκευαστή και μια δημόσια μέθοδο έχουν δηλωθεί στον κώδικα. Ο κατασκευαστής θα εκτυπώσει ένα μήνυμα όταν δημιουργηθεί ένα νέο κοινόχρηστο αντικείμενο με τον κατασκευαστή. ο Απεικόνιση() η μέθοδος θα εκτυπώσει μηνύματα με βάση το αντικείμενο κοινόχρηστου δείκτη που καλεί. Εδώ, δημιουργήθηκε το πρώτο κοινόχρηστο αντικείμενο δείκτη χωρίς να καλέσετε τον κατασκευαστή. Το δεύτερο κοινόχρηστο αντικείμενο δείκτη δημιουργήθηκε καλώντας τον κατασκευαστή. Ο τρίτος κοινόχρηστος δείκτης δημιουργήθηκε εκχωρώντας τον πρώτο κοινόχρηστο δείκτη. ο Απεικόνιση() η μέθοδος έχει κληθεί τρεις φορές χρησιμοποιώντας τρία κοινά αντικείμενα δείκτη.







// Συμπεριλάβετε τις απαραίτητες βιβλιοθήκες

#περιλαμβάνω

#περιλαμβάνω

usingnamespacestd?

// Ορίστε την τάξη
classMyClass{
δημόσιο:
// Δηλώστε τον κατασκευαστή
Η τάξη μου() {
κόστος<<«Ο κατασκευαστής ονομάζεται. n'?
}
// Δηλώστε μια μέθοδο εκτύπωσης κειμένου
voidDisplay(str. str)
{
κόστος<<'Η μέθοδος Display () καλείται από το'<<Π<<'δείκτης. n'?
}
}?

εσωτερική()
{
// Αρχικοποιήστε το shared_ptr χωρίς να καλέσετε τον κατασκευαστή
shared_ptr p1=make_shared()?
σελ 1->Απεικόνιση('πρώτα')?
// Αρχικοποιήστε το shared_ptr καλώντας τον κατασκευαστή
shared_ptr p2=shared_ptr(newMyClass)?
σελ2->Απεικόνιση('δεύτερος')?

// Αρχικοποιήστε το shared_ptr με ανάθεση
shared_ptr p3=σελ 1?
σελ 3->Απεικόνιση('τρίτος')?
επιστροφή0?
}

Παραγωγή:



Η ακόλουθη έξοδος θα εμφανιστεί μετά την εκτέλεση του παραπάνω κώδικα. Ο κατασκευαστής έχει καλέσει μόνο κατά τη δημιουργία του δεύτερου αντικειμένου. Έτσι, το μήνυμα του κατασκευαστή εκτυπώθηκε μόνο μία φορά:







Παράδειγμα 2: Εκτυπώστε την αποθηκευμένη τοποθεσία κοινού δείκτη

Ο κοινόχρηστος δείκτης συνάρτησης get () χρησιμοποιείται για την επιστροφή της αποθηκευμένης, κοινής θέσης δείκτη. Το ακόλουθο παράδειγμα θα εκτυπώσει τη θέση των αποθηκευμένων, κοινόχρηστων δεικτών που δημιουργούνται από την κλάση και τη συνάρτηση. Εδώ, μια κλάση με έναν κατασκευαστή έχει οριστεί να χρησιμοποιείται για τη δημιουργία ενός κοινόχρηστου δείκτη. Έχει δηλωθεί μια συνάρτηση για τη δημιουργία ενός κοινόχρηστου δείκτη και την εκτύπωση της θέσης του κοινόχρηστου δείκτη χρησιμοποιώντας τη συνάρτηση get (). Σε αυτόν τον κώδικα, ο πρώτος κοινόχρηστος δείκτης δημιουργήθηκε χρησιμοποιώντας την κλάση, ο δεύτερος κοινόχρηστος δείκτης δημιουργήθηκε χρησιμοποιώντας τη συνάρτηση και ο τρίτος κοινόχρηστος δείκτης δημιουργήθηκε με την εκχώρηση του πρώτου δείκτη.

// Συμπεριλάβετε τις απαραίτητες βιβλιοθήκες

#περιλαμβάνω

#περιλαμβάνω

usingnamespacestd?

// Ορίστε την τάξη
classMyClass
{
δημόσιο:
// Δηλώστε τον κατασκευαστή
Η τάξη μου() {
κόστος<<«Ο κατασκευαστής ονομάζεται. n'?
}
}?
// Ορισμός συνάρτησης για την προετοιμασία του δείκτη
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass)?
κόστος<<σελ2παίρνω() <<' n'?
}

εσωτερική()
{
// Αρχικοποιήστε το shared_ptr καλώντας τον κατασκευαστή
shared_ptr p1=shared_ptr(newMyClass)?
κόστος<<σελ 1παίρνω() <<' n'?

// Αρχικοποιήστε το shared_ptr καλώντας τη λειτουργία
Init_shared_ptr()?

// Αρχικοποιήστε το shared_ptr με ανάθεση
shared_ptr p3=σελ 1?
κόστος<<σελ 3παίρνω() <<' n'?
επιστροφή0?
}

Παραγωγή:



Η ακόλουθη παρόμοια έξοδος θα εμφανιστεί μετά την εκτέλεση του παραπάνω κώδικα. Στην έξοδο, η επιστρεφόμενη τιμή της συνάρτησης get () για τον πρώτο και τον τρίτο κοινό δείκτη είναι η ίδια. Ωστόσο, ο δεύτερος κοινόχρηστος δείκτης είναι διαφορετικός:

Παράδειγμα 3: Μετρήστε τα αντικείμενα κοινόχρηστου δείκτη

Το ακόλουθο παράδειγμα απεικονίζει έναν τρόπο μέτρησης του αριθμού των αντικειμένων που επισημαίνονται από έναν κοινό δείκτη μετά τη δημιουργία και την καταστροφή του δείκτη. Μια κλάση με έναν κατασκευαστή έχει δηλωθεί στον κώδικα. Ο πρώτος κοινόχρηστος δείκτης δημιουργήθηκε χρησιμοποιώντας την κλάση και ο δεύτερος κοινόχρηστος δείκτης δημιουργήθηκε χρησιμοποιώντας τον πρώτο κοινόχρηστο δείκτη. Ο αριθμός των αντικειμένων που δείχνουν και οι δύο κοινόχρηστοι δείκτες πριν και μετά την κλήση της λειτουργίας επαναφοράς () έχει εκτυπωθεί αργότερα.

// Συμπεριλάβετε τις απαραίτητες βιβλιοθήκες

#περιλαμβάνω

#περιλαμβάνω

usingnamespacestd?
// Ορίστε την τάξη
classMyClass{
δημόσιο:
// Δηλώστε τον κατασκευαστή
Η τάξη μου() {
κόστος<<«Ο κατασκευαστής ονομάζεται. n'?
}
}?
εσωτερική()
{
// Αρχικοποιήστε το πρώτο shared_ptr καλώντας τον κατασκευαστή
shared_ptr p1(newMyClass)?

// Εμφάνιση του αριθμού των αντικειμένων shared_ptr από τον πρώτο δείκτη
κόστος<<'p1 που δείχνει'<<σελ 1use_count() <<'αντικείμενο (α). n'?
// Αρχικοποιήστε το δεύτερο shared_ptr χρησιμοποιώντας το πρώτο shared_ptr
shared_ptr p2(σελ 1)?
// Εμφάνιση του αριθμού των αντικειμένων shared_ptr από τον πρώτο και τον δεύτερο δείκτη
κόστος<<'p2 που δείχνει'<<σελ2use_count() <<'αντικείμενο (α). n'?
κόστος<<'p1 που δείχνει'<<σελ 1use_count() <<'αντικείμενο (α). n'?
// Καταργήστε την ιδιοκτησία του πρώτου δείκτη από το αντικείμενο shared_ptr
σελ 1επαναφορά()?
// Εμφάνιση του αριθμού των αντικειμένων shared_ptr από τον δεύτερο δείκτη
κόστος<<'p2 που δείχνει'<<σελ2use_count() <<'αντικείμενο (α). n'?
επιστροφή0?
}

Παραγωγή:

Η ακόλουθη έξοδος θα εμφανιστεί μετά την εκτέλεση του παραπάνω κώδικα. Ο πρώτος δείκτης, σελ 1 , δείχνει ένα αντικείμενο μετά τη δημιουργία. Μετά τη δημιουργία του δεύτερου δείκτη, σελ2 , χρησιμοποιώντας τον πρώτο δείκτη, σελ 1 , και οι δύο δείκτες δείχνουν δύο αντικείμενα για κοινή χρήση του δείκτη. Αφού καλέσετε τη λειτουργία επαναφοράς () για τον δείκτη, σελ 1 , ένα αντικείμενο έχει καταστραφεί και ο δείκτης, σελ2 , τώρα δείχνει μόνο ένα αντικείμενο.

Συμπέρασμα:

Οι σκοποί της χρήσης ενός κοινόχρηστου δείκτη στο C ++ εξηγήθηκαν σε αυτό το σεμινάριο χρησιμοποιώντας απλά παραδείγματα. Δημιουργία κοινών δεικτών με διαφορετικούς τρόπους, αποθήκευση της τοποθεσίας κοινού δείκτη και καταμέτρηση του αριθμού των αντικειμένων που επισημαίνονται από τους κοινόχρηστους δείκτες. Ελπίζω ότι οι κωδικοποιητές C ++ θα μπορούν να χρησιμοποιούν τον κοινόχρηστο δείκτη στον κώδικα τους αφού διαβάσουν αυτό το σεμινάριο.