human: Как устроен std::shared_ptr ?
gpt
`std::shared_ptr` — это умный указатель (*smart pointer*) в стандартной библиотеке C++, который предоставляет автоматическое управление памятью для объектов, которые могут быть разделены между несколькими владельцами.

Умный указатель `std::shared_ptr` содержит два указателя:
1) указатель на управляемый объект;
2) указатель на управляющий блок (*control block*).

Управляющий блок содержит счётчик ссылок (*reference count*), который отслеживает количество владельцев управляемого объекта. Когда создаётся новый `std::shared_ptr`, счётчик ссылок увеличивается на 1. Когда `std::shared_ptr` уничтожается, счётчик ссылок уменьшается на 1. Когда счётчик ссылок достигает нуля, управляемый объект автоматически удаляется.

Кроме того, управляющий блок также содержит указатель на функцию удаления (*deleter*), которая вызывается при удалении управляемого объекта. Это позволяет использовать `std::shared_ptr` для управления памятью объектов, которые были выделены с помощью оператора `new`, а также тех объектов, которые были созданы с помощью других методов выделения памяти.

В целом `std::shared_ptr` предоставляет удобный и безопасный способ управления памятью в C++, который позволяет избежать утечек памяти и ошибок при работе с указателями.