Зміст курсу
Розумні Вказівники C++
Розумні Вказівники C++
Вступ до Спільних Вказівників
Так само, як і унікальний вказівник, спільний вказівник використовується для виділення та зберігання адреси динамічно виділеного об'єкта. Основна відмінність між цими двома типами вказівників полягає в тому, що спільний вказівник за дизайном є спільним. Він може безпечно мати більше ніж одного власника. Насправді, його слід використовувати лише тоді, коли вам потрібно, щоб об'єкт мав кілька власників.
Як працюють спільні вказівники?
На відміну від унікальних вказівників, спільні вказівники підтримують лічильник посилань. Лічильник посилань спільного вказівника відстежує кількість спільних вказівників, які наразі посилаються (володіють) на той самий об'єкт.
Коли спільний вказівник виходить за межі області видимості або явно скидається, лічильник посилань автоматично зменшується. Як тільки лічильник посилань досягає 0, це означає, що жоден спільний вказівник більше не посилається на об'єкт, і пам'ять об'єкта автоматично звільняється.
shared_pointer
#include <iostream> template <typename T> class SharedPointer { public: explicit SharedPointer(T* ptr = nullptr) : pointer(ptr), reference_count(new int(1)) {} SharedPointer(const SharedPointer& other) : pointer(other.pointer), reference_count(other.reference_count) { (*reference_count)++; } SharedPointer& operator=(const SharedPointer& other) { if (this != &other) { if (--(*reference_count) == 0) { delete pointer; delete reference_count; } pointer = other.pointer; reference_count = other.reference_count; (*reference_count)++; } return *this; } ~SharedPointer() { if (--(*reference_count) == 0) { delete pointer; delete reference_count; } } T* operator->() const { return pointer; } T& operator*() const { return *pointer; } private: T* pointer; int* reference_count; };
Це безпомилковий спосіб забезпечити безпечне спільне володіння динамічними даними. Оскільки, навіть при спільному використанні даних, програма менш схильна до витоків/пошкоджень пам'яті, і вам не потрібно вручну викликати delete
.
Дякуємо за ваш відгук!