Одна из важных характеристик unique_ptr
unique_ptr
в другую. Именно поэтому нам пришлось перемещать существующий уникальный указатель в функцию process_item
. Если бы мы могли скопировать уникальный указатель, то это значило бы, что объектом обладали сразу unique_ptr
shared_ ptr
, необходимость создавать объекты в куче вручную с помощью ключевых слов new
и delete
возникает редко. Используйте эти классы везде, где возможно! unique_ptr
не создает никаких лишних издержек во время выполнения.Автоматическое управление разделяемой памятью кучи с использованием std::shared_ptr
В предыдущем примере мы узнали, как использовать unique_ptr
Тип указателя shared_ptr
В этом примере вы узнаете, как использовать shared_ptr
unique_ptr
:.Как это делается
В этом примере мы напишем программу, похожую на ту, которую мы писали в предыдущем примере, чтобы освоить основные принципы использования общих указателей.
1. Сначала включим необходимые заголовочные файлы и объявим об использовании пространства имен std
#include
#include
using namespace std;
2. Затем определим небольшой вспомогательный класс, который поможет увидеть, когда его экземпляры будут создаваться и разрушаться. Мы станем управлять его экземплярами с помощью shared_ptr
class Foo
{
public:
string name;
Foo(string n)
: name{move(n)}
{ cout << "CTOR " << name << '\n'; }
~Foo() { cout << "DTOR " << name << '\n'; }
};
3. Далее реализуем функцию, которая принимает общий указатель на экземпляр типа Foo
void f(shared_ptr
{
cout << "f: use counter at "
<< sp.use_count() << '\n';
}
4. В функции main
null
:int main()
{
shared_ptr
5. Далее откроем еще одну область видимости и создадим два объекта типа Foo
new
и передадим его в конструктор типа shared_ptr
. Далее создадим второй экземпляр, используя make_shared
, что позволяет создать экземпляр типа Foo
на основе переданных нами параметров. Этот метод более элегантен, поскольку можно воспользоваться автоматическим выведением типов, и объект уже будет управляемым, когда у нас появится первая возможность получить к нему доступ. Это очень похоже на тот код, который мы писали в примере для unique_ptr
. {
cout << "Inner scope begin\n";
shared_ptr
auto f2 (make_shared