Для понимания интеллектуальных указателей у нас должно быть понимание, почему мы будем использовать интеллектуальные указатели. Умные указатели являются частью версии C++11.
Типы интеллектуальных указателей
- auto_ptr
- unique_ptr
- shared_ptr
- слабый_ptr
auto_ptr
Это интеллектуальный указатель, который управляет объектом, полученным с помощью нового выражения, и удаляет этот объект, когда уничтожается указатель, который сам по себе является auto_ptr. В основном он основан на модели монопольного владения, когда только один указатель может указывать на любой объект, и никакой другой указатель не может указывать на этот объект.

class sample{ public: void display() { cout<<"sample_display" << "\n"; }};int main(){ auto_ptr<sample>p1(new sample); cout<<p1.get() <<endl; // This will return the memory address. }
Выход :
sample_display
0x1h48s60
Unique_ptr
Это в основном то же самое, что и автоматический указатель, но с улучшенной безопасностью, т. е. нет поддельных назначений и копий назначений, главное, что удаляющие также поддерживают добавленные массивы. Он явно предотвращает копирование содержащегося в нем указателя, как это произошло бы при обычном присваивании. И обработка копирования очень уникальна, когда этот unique_ptr уничтожается, ресурс автоматически запрашивается. Кроме того, поскольку для любого ресурса может быть только один unique_ptr, любая попытка сделать копию unique_ptr вызовет ошибку времени компиляции.
unique_ptr<sample>ptr1 (new sample);// Error: can't copy unique_ptr unique_ptr<A> ptr2 = ptr1;---------------Code---------------------class sample{ public: void display() { cout<<"sample_display" << "\n"; }};int main(){ unique_ptr<sample>p1(new sample); p1->show; cout<<p1.get() <<endl; // This will return the memory address. unique_ptr<sample>p2 = move(p1); // transfering the onwership cout<<p1.get() <<endl; // This will return 0 as onwership transferred cout<<p2.get() <<endl; }
Выход :
sample_display
0x1h48s60
0
0x1c4ac20
Зачем использовать unique_ptr?
Он используется, когда вы хотите
- Единственная собственность
- один уникальный указатель уникален для каждого объекта
- Не хочу копировать один уникальный указатель в другой
shared_ptr
Это указатели, которые также называются необработанными указателями. Он поддерживает ссылку, означающую, что указатель используется совместно сколькими объектами или местами, поэтому счетчик увеличивается всякий раз, когда новый указатель указывает на ресурс, на который также указывает другой.
Подсчет ссылок: это способ хранения количества ссылок, указателей или дескрипторов на ресурс, такой как объект, блок памяти или дисковое пространство.
- Он в основном используется, когда у нас есть необработанный указатель на многих владельцев.
class sample{ public: void display() { cout<<"sample_display" << "\n"; }};int main(){ shared_ptr<sample>p1(new sample); cout<<p1.get() <<endl; // This will return the memory address. shared_ptr<sample>p2(p1); p2->show(); cout<< p1.use_count() << "\n"; cout<< p2.use_count() << "\n"; }
Выход :
sample_display
2
2
Зачем использовать Shared_ptr
- Когда хотите поделиться собственностью
- Когда все общие указатели на ресурсы выходят за пределы области действия, ресурс уничтожается.
слабый_ptr
Это то же самое, что и shared_pointer. Несмотря на то, что он не участвует в подсчете ссылок, он дает доступ к объекту, который удерживается одним или несколькими экземплярами общего указателя. На общий ptr и другие его копии не влияет существование или уничтожение слабого ptr.
Циклическая зависимость: это тот случай, когда есть два класса и указатели обоих указателей на каждый, в этом случае use_count никогда не достигнет нуля и они никогда не будут удалены. С другой стороны, мы знаем, что по этой причине используются слабые указатели (weak ptr), которые не учитывают ссылки. Поскольку владение не является общим, класс, в котором объявлен слабый ptr, не имеет над ним цитадели, но они все равно могут получить доступ к этим объектам.

Когда использовать слабые указатели
- Когда мы хотим сослаться на какой-либо объект из нескольких мест и для разыменования, они просто отмечают, что объект исчез.