Класс 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,
который возвращает количество владельцев