Розуміння розумних вказівників C++: унікальні, спільні та слабкі

C++ | Поради

pic

Вступ

Розуміння розумних вказівників у C++: унікальні, спільні та слабкі вказівники

Розумні вказівники — потужна функція в C++, яка допомагає безпечно та ефективно керувати динамічною пам'яттю. У цьому пості ми розглянемо унікальні вказівники, спільні вказівники та слабкі вказівники, пояснивши їхні відмінності та показавши приклади коду, як вони працюють.

Унікальні вказівники

Унікальний вказівник забезпечує виключне володіння об'єктом. Він гарантує, що лише один вказівник керує ресурсом у будь-який час. Коли унікальний вказівник виходить з області видимості, об'єкт, яким він керує, автоматично знищується.

#include   
#include   

class Entity {  
public:  
 Entity() { std::cout << "Entity Created\n"; }  
 ~Entity() { std::cout << "Entity Destroyed\n"; }  
};  

int main() {  
 std::unique_ptr entity = std::make_unique();  
 return 0;  
}

Виведення:

Entity Created  
Entity Destroyed

Спільні вказівники

Спільний вказівник дозволяє кільком вказівникам ділити володіння об'єктом. Об'єкт знищується, коли останній спільний вказівник, що керує ним, виходить з області видимості.

#include   
#include   

class Entity {  
public:  
 Entity() { std::cout << "Entity Created\n"; }  
 ~Entity() { std::cout << "Entity Destroyed\n"; }  
};  

int main() {  
 std::shared_ptr sharedEntity = std::make_shared();  
 {  
 std::shared_ptr sharedEntity2 = sharedEntity;  
 }  
 std::cout << "End of main\n";  
 return 0;  
}

Виведення:

Entity Created  
End of main  
Entity Destroyed

Слабкі вказівники

Слабкий вказівник — це неволодіючий посилання на об'єкт, яким керує спільний вказівник.
Це не збільшує кількість посилань і корисне для розриву циклічних посилань.

#include   
#include   

class Entity {  
public:  
 Entity() { std::cout << "Entity Created\n"; }  
 ~Entity() { std::cout << "Entity Destroyed\n"; }  
};  

int main() {  
 std::shared_ptr sharedEntity = std::make_shared();  
 std::weak_ptr weakEntity = sharedEntity;  
 std::cout << "End of main\n";  
 return 0;  
}

Виведення:

Entity Created  
End of main  
Entity Destroyed
#include   
#include   

class Entity  
{  
public:  
 Entity() { std::cout << "Entity Created\n"; }  
 ~Entity() { std::cout << "Entity Destroyed\n"; }  
 void Print() { std::cout << "Hello Entity!\n"; }  
};  

int main()  
{  
 std::cout << "\n-------------unique_ptr-----------------\n";  
 {  
 // приклад використання unique_ptr (управління єдиним володінням)  
 std::unique_ptr entity = std::make_unique();   
 // std::unique_ptr e0 = entity; // Помилка: unique_ptr не можна копіювати  
 }  
 // unique_ptr автоматично знищує об'єкт тут  

 std::cout << "\n-------------shared_ptr----------------\n";  
 {  
 // приклад використання shared_ptr (спільне володіння, лічильник посилань збільшується)  
 std::shared_ptr entity;  

 {  
 std::cout << "-----------------------\n";  
 std::shared_ptr e0 = std::make_shared();  
 entity = e0; // лічильник посилань = 2  
 std::cout << "-----------------------\n";  

 {  
 std::shared_ptr e1 = std::make_shared();  
 entity = e1; // лічильник посилань скидається, старий об'єкт знищується  
 }  
 std::cout << "-----------------------\n";  

 {  
 // weak_ptr (не збільшує лічильник посилань)  
 std::weak_ptr weakPtr = entity;   
 }  
 std::cout << "-----------------------\n";  
 }  
 }  

 std::cout << "-------------End main---------------\n";  
 return 0;  
}  

/* Виведення:  

-------------unique_ptr-----------------  
Entity Created  
Entity Destroyed  

-------------shared_ptr----------------  
-----------------------  
Entity Created  
-----------------------  
Entity Created  
-----------------------  
-----------------------  
Entity Destroyed  
Entity Destroyed  
-------------End main---------------  
*/

YouTube Video

Висновок

Розумні вказівники в C++ допомагають автоматично керувати динамічною пам'яттю, зменшуючи ризик витоків пам'яті та висячих вказівників. Унікальні вказівники забезпечують єдине володіння, спільні вказівники дозволяють спільне володіння з лічильником посилань, а слабкі вказівники запобігають збільшенню лічильника посилань, надаючи доступ до об'єкта.

Розуміння цих інструментів може значно підвищити безпеку та читабельність вашого коду на C++.

Перекладено з: Understanding C++ Smart Pointers: Unique, Shared, and Weak

Leave a Reply

Your email address will not be published. Required fields are marked *