logo

shared_ptr în C++

std::shared_ptr este unul dintre indicatoarele inteligente introduse în C++11. Spre deosebire de un indicator simplu, are asociat un bloc de control care ține evidența numărului de referințe pentru obiectul gestionat. Acest număr de referințe este partajat între toate copiile instanțelor shared_ptr care indică același obiect, asigurând gestionarea și ștergerea corectă a memoriei.

Cerințe preliminare: Pointeri în C++ , Indicatori inteligente în C++ .



shared_ptr-in-CPP

Pointer partajat în C++

Sintaxa std::shared_ptr

Shared_ptr de tip T poate fi declarat ca:

  std::shared_ptr      ptr_name;>

Inițializarea obiectelor shared_ptr

Putem inițializa shared_ptr folosind următoarele metode:



1. Inițializare folosind un nou indicator

shared_ptr ptr (new T()); shared_ptr ptr = make_shared (new T());>

2. Inițializare folosind Pointer-ul existent

shared_ptr ptr(already_existing_pointer); shared_ptr ptr = make_shared(already_existing_pointer);>

Metodele membrilor shared_ptr

Mai jos sunt câțiva membri asociați cu shared_ptr:



Metodă Descriere
reset() Resetează std::shared_ptr la gol, eliberând dreptul de proprietate asupra obiectului gestionat.
use_count() Returnează numărul de referințe curent, indicând câte instanțe std::shared_ptr partajează proprietatea.
unic() Verificați dacă există un singur std::shared_ptr care deține obiectul (numărul de referințe este 1).
obține() Returnează un pointer brut către obiectul gestionat. Fiți atenți când utilizați această metodă.
swap(shr_ptr2) schimbă conținutul (proprietatea) a două instanțe std::shared_ptr.

Exemple de std::shared_ptr

Exemplul 1:

C++




// C++ program to demonstrate shared_ptr> #include> #include> using> namespace> std;> class> A {> public>:> >void> show() { cout << 'A::show()' << endl; }> };> int> main()> {> >// creating a shared pointer and accessing the object> >shared_ptr p1(> new> A);> >// printting the address of the managed object> >cout << p1.get() << endl;> >p1->arată();> > >// creating a new shared pointer that shares ownership> >shared_ptr> p2(p1);> >p2->arată();> > >// printing addresses of P1 and P2> >cout << p1.get() << endl;> >cout << p2.get() << endl;> > >// Returns the number of shared_ptr objects> >// referring to the same managed object.> >cout << p1.use_count() << endl;> >cout << p2.use_count() << endl;> > >// Relinquishes ownership of p1 on the object> >// and pointer becomes NULL> >p1.reset();> >cout << p1.get() << endl;> >cout << p2.use_count() << endl;> >cout << p2.get() << endl;> >/*> >These lines demonstrate that p1 no longer manages an> >object (get() returns nullptr), but p2 still manages the> >same object, so its reference count is 1.> >*/> >return> 0;> }>

>

>

Ieșire

0x1365c20 A::show() A::show() 0x1365c20 0x1365c20 2 2 0 1 0x1365c20>

Exemplul 2:

C++




// C++ program to illustrate the use of make_shared> #include> #include> using> namespace> std;> int> main()> {> >// Creating shared pointers using std::make_shared> >shared_ptr<>int>>shr_ptr1 = make_shared<>int>>(42);> >shared_ptr<>int>>shr_ptr2 = make_shared<>int>>(24);> >// Accessing the values using the dereference operator> >// (*)> >cout << 'Value 1: ' << *shr_ptr1 << endl;> >cout << 'Value 2: ' << *shr_ptr2 << endl;> >// Using the assignment operator (=) to share ownership> >shared_ptr<>int>>shr_ptr3 = shr_ptr1;> >// Checking if shared pointer 1 and shared pointer 3> >// point to the same object> >if> (shr_ptr1 == shr_ptr3) {> >cout << 'shared pointer 1 and shared pointer 3 '> >'point to the same object.'> ><< endl;> >}> >// Swapping the contents of shared pointer 2 and shared> >// pointer 3> >shr_ptr2.swap(shr_ptr3);> >// Checking the values after the swap> >cout << 'Value 2 (after swap): ' << *shr_ptr2 << endl;> >cout << 'Value 3 (after swap): ' << *shr_ptr3 << endl;> >// Using logical operators to check if shared pointers> >// are valid> >if> (shr_ptr1 && shr_ptr2) {> >cout << 'Both shared pointer 1 and shared pointer '> >'2 are valid.'> ><< endl;> >}> >// Resetting a shared pointer> >shr_ptr1.reset();> }>

>

>

Ieșire

Value 1: 42 Value 2: 24 shared pointer 1 and shared pointer 3 point to the same object. Value 2 (after swap): 42 Value 3 (after swap): 24 Both shared pointer 1 and shared pointer 2 are valid.>

Exemplul 3: Implementarea unei liste legate folosind std::shared_ptr

C++




#include> #include> using> namespace> std;> // Define a singly linked list node> struct> Node {> >int> data;> >shared_ptr next;> >Node(>int> val)> >: data(val)> >, next(NULL)> >{> >}> };> class> LinkedList {> public>:> >LinkedList()> >: head(NULL)> >{> >}> >// Insert a new node at the end of the linked list> >void> insert(>int> val)> >{> >shared_ptr newNode = make_shared(val);> >if> (!head) {> >head = newNode;> >}> >else> {> >shared_ptr current = head;> >while> (current->următorul) {> >current = current->următorul;> >}> >current->următorul = newNode;> >}> >}> >// Delete a node with a given value from the linked list> >void> del(>int> val)> >{> >if> (!head) {> >return>;> >}> >if> (head->date == val) {> >head = head->următorul;> >return>;> >}> >shared_ptr current = head;> >while> (current->următorul> >&& current->următorul->date != val) {> >current = current->următorul;> >}> >if> (current->următorul && curent->next->date == val) {> >current->următor = curent->next->next;> >}> >}> >// Traverse and print the linked list> >void> Print()> >{> >shared_ptr current = head;> >while> (current) {> >cout current = current->Următorul; } cout<< 'NULL' << endl; } private: shared_ptr head; }; int main() { LinkedList linkedList; // Insert nodes into the linked list linkedList.insert(1); linkedList.insert(2); linkedList.insert(3); // Print the linked list cout << 'Linked List: '; linkedList.Print(); // Delete a node and print the updated linked list linkedList.del(2); cout << 'Linked List after deleting 2: '; linkedList.Print(); return 0; }>

>

mysql update join

>

Ieșire