shared_ptr позволяет нескольким указателям указывать на тот же объект, а указатель unique_ptr — нет. Библиотека определяет также сопутствующий класс weak_ptr, являющийся второстепенной ссылкой на объект, управляемый указателем shared_ptr. Все три класса определены в заголовке memory.
12.1.1. Класс shared_ptr
shared_ptr
shared_ptr> p2; //
//
Инициализированный по умолчанию интеллектуальный указатель хранит нулевой указатель (см. раздел 2.3.2). Дополнительные способы инициализации интеллектуального указателя рассматриваются в разделе 12.1.3.
Интеллектуальный указатель используется теми же способами, что и обычный указатель. Обращение к значению интеллектуального указателя возвращает объект, на который он указывает. Когда интеллектуальный указатель используется в условии, результат проверки может засвидетельствовать, не является ли он нулевым:
//
if (p1 && p1->empty())
*p1 = "hi"; //
//
Список общих функций указателей shared_ptr и unique_ptr приведен в табл. 12.1. Функции, специфические для указателя shared_ptr, перечислены в табл. 12.2.
Таблица 12.1. Функции, общие для указателей shared_ptr и unique_ptr
shared_ptr | Нулевой интеллектуальный указатель, способный указывать на объекты типа Т |
p | При использовании указателя p в условии возвращается значение true, если он указывает на объект |
*p | Обращение к значению указателя p возвращает объект, на который он указывает |
p->mem | Синоним для (*p).mem |
p.get() | Возвращает указатель, хранимый указателем p. Используйте его осторожно, поскольку объект, на который он указывает, может прекратить существование после удаления его интеллектуальным указателем |
swap(p, q) p.swap(q) | Обменивает указатели в p и q |
Таблица 12.2. Функции, специфические для указателя shared_ptr