Итак, в предыдущем видео мы с вами сформулировали некоторую задачу для решения которой unique_ptr недостаточно. И мы знаем, что для ее решения нам стоит использовать shared_ptr. Но давайте, собственно, посмотрим на то, как он работает. У нас есть некоторый код, который мы использовали для демонстрации возможностей unique_ptr. Так давайте его соберем и запустим. Так, мы видим, что он создает actor, дальше его вызывает несколько раз и после этого actor удаляется. Хорошо! В принципе все как и раньше. Если здесь мы создавали именно unique_ptr, то давайте начнем с того, что вместо unique_ptr будем создавать shared_ptr. И если unique_ptr мы создавали с помощью функции make_unique то как вы возможно можете догадаться мы будем создавать с помощью функции make_shared и давайте здесь для наглядности вместо auto в явном виде напишем тип, это будет shared_ptr<Actor>. На самом деле мы в реальности его писать здесь в явном виде конечно не будем, мы оставим auto. Здесь, чтобы было видно, вот make_shared создаем наш shared_ptr на Actor и больше ничего менять пока не будем. Соберем программу таким образом, значит она у нас действительно собралась. Запустим и она отработала точно таким же образом. Что приводит нас к первому важному выводу: shared_ptr умеет делать все то же самое, что и unique_ptr и кое-что еще. Соответственно давайте посмотрим, что еще он может делать. Для начала вспомним немного например. Как то, что у нас выводится соответствует тому, что у нас написано в коде. Значит сначала у нас создается Actor, дальше дважды выполняется работа, а дальше у нас вот "An actor was expected", то есть передается нулевой actor. Соответственно вот здесь он создается, в первом ранее выполняется работы первый раз. Дальше у нас actor перемещается из ptr в ptr2, выполняется работа на ptr2 и выполняется run на исходным ptr из которого мы переместили и в котором на данный момент у нас нулевой указатель. Соответственно unique_ptr у нас копировать было нельзя. Главное отличие от shared_ptr в том, что shared_ptr копировать можно, потому что shared_ptr он разделяемый. Несколько shared_ptr могут ссылаться на один и тот же объект и это совершенно нормально. Поэтому, чтобы превратить перемещение в копирование мы займемся тем, что удалим здесь функцию move. Вот теперь ptr2 является копией ptr. Давайте соберем такой код, видим что у нас успешно собрался, запустим и как мы видим теперь последний вызов функции run у нас точно так же вызывает у actor некоторую работу, то есть он продолжает ссылаться на тот же самый actor. Мы видим, что вот эти две функции run вызваны для ptr2 и ptr они оба отрабатывают, оба вызывают вывод в консоль, поэтому ptr и ptr2 они оба одновременно указывают на этот объект. Это в общем то то, что нам и нужно было получить. Этих знаний о shared_ptr нам с вами на самом деле уже достаточно, для того, чтобы реализовать наши новые требования. О подобном устройстве shared_ptr и как конкретно ему удается делать копирование и указывать на один и тот же объект и о его внутреннем устройстве мы поговорим уже в следующих видео.