РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
643 of 815 menu

Класс shared_ptr

Класс shared_ptr - это умный указатель с общим владением. Несколько указателей shared_ptr могут указывать на один и тот же объект и совместно им владеть. Внутри хранится счётчик ссылок: когда создаётся новый shared_ptr, счётчик увеличивается, а когда указатель уничтожается или сбрасывается - уменьшается. Как только счётчик становится равным 0, объект автоматически удаляется. В конструктор мы передаём либо готовый указатель, либо другой shared_ptr, либо используем функцию make_shared для создания объекта. Класс объявлен в заголовочном файле <memory>.

Синтаксис

#include <memory> std::shared_ptr<T> ptr; std::shared_ptr<T> ptr(new T(...)); std::shared_ptr<T> ptr = std::make_shared<T>(...); std::shared_ptr<T> ptr(other);

Пример

Давайте создадим умный указатель shared_ptr на число и выведем его значение через разыменование:

#include <iostream> #include <memory> using namespace std; int main() { shared_ptr<int> ptr = make_shared<int>(42); cout << *ptr << endl; cout << ptr.use_count() << endl; return 0; }

Результат выполнения кода:

42 1

Пример

Давайте создадим два указателя shared_ptr, которые владеют одним и тем же объектом, и посмотрим, как меняется счётчик ссылок:

#include <iostream> #include <memory> using namespace std; int main() { shared_ptr<int> ptr1 = make_shared<int>(10); shared_ptr<int> ptr2 = ptr1; cout << ptr1.use_count() << endl; cout << ptr2.use_count() << endl; ptr2.reset(); cout << ptr1.use_count() << endl; return 0; }

Результат выполнения кода:

2 2 1

Пример

Давайте проверим, что объект удаляется автоматически, когда уничтожается последний владелец:

#include <iostream> #include <memory> using namespace std; struct Test { Test() { cout << "created" << endl; } ~Test() { cout << "destroyed" << endl; } }; int main() { shared_ptr<Test> ptr1 = make_shared<Test>(); shared_ptr<Test> ptr2 = ptr1; ptr1.reset(); cout << "after reset" << endl; ptr2.reset(); cout << "after second reset" << endl; return 0; }

Результат выполнения кода:

"created" "after reset" "destroyed" "after second reset"

Пример

Давайте используем shared_ptr для хранения массива строк и выведем его содержимое:

#include <iostream> #include <memory> #include <string> using namespace std; int main() { shared_ptr<string> ptr = make_shared<string>("abcde"); cout << *ptr << endl; cout << ptr->length() << endl; return 0; }

Результат выполнения кода:

"abcde" 5

Смотрите также

  • функция make_shared,
    которая создаёт объект и возвращает shared_ptr
  • метод get,
    который возвращает сырой указатель
  • метод reset,
    который сбрасывает владение объектом
  • метод use_count,
    который возвращает количество владельцев
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить