C ++ shared_ptr

C Shared_ptr



В shared_ptr - это один из типов интеллектуальных указателей C ++, который содержит общее владение объектом, созданным указателем. Он разделяет владение объектом при сохранении указателя на другой объект, а общий счетчик ссылок подсчитывает количество владельцев. В shared_ptr увеличивает счетчик ссылок на единицу после копирования объекта и уменьшает счетчик ссылок на единицу после уничтожения объекта. Память, принадлежащая объекту, перераспределяется, если объект, принадлежащий последнему shared_ptr уничтожен, или сброс настроек() вызывается функция, чтобы присвоить объекту другой указатель. Когда shared_ptr не владеет никаким объектом, тогда он называется пустым общим указателем. Различные варианты использования shared_ptr были показаны в этом руководстве.

Пример 1: объявить общий указатель разными способами

В следующем примере показаны три разных способа объявления общего указателя. В коде объявлены класс с конструктором и публичный метод. Конструктор напечатает сообщение, когда с помощью конструктора будет создан новый общий объект. В Отображать() будет печатать сообщения на основе вызывающего объекта общего указателя. Здесь первый объект общего указателя был создан без вызова конструктора. Второй объект общего указателя был создан путем вызова конструктора. Третий общий указатель создан путем присвоения первого общего указателя. В Отображать() метод был вызван три раза с использованием трех объектов общего указателя.







// Включаем необходимые библиотеки

#включают

#включают

usingnamespacestd;

// Определяем класс
classMyClass{
общественный:
// Объявляем конструктор
Мои занятия() {
Стоимость<<'Вызывается конструктор. п';
}
// Объявляем метод для печати текста
voidDisplay(строка str)
{
Стоимость<<'Метод Display () вызывается из'<<п<<указатель. п';
}
};

intmain()
{
// Инициализируем shared_ptr без вызова конструктора
shared_ptr p1знак равноmake_shared();
p1->Отображать('первый');
// Инициализируем shared_ptr, вызывая конструктор
shared_ptr p2знак равноshared_ptr(newMyClass);
p2->Отображать('второй');

// Инициализируем shared_ptr присвоением
shared_ptr p3знак равноp1;
p3->Отображать('в третьих');
return0;
}

Выход:



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







Пример 2: Распечатать сохраненное местоположение общего указателя

Общий указатель функции get () используется для возврата сохраненного местоположения общего указателя. В следующем примере будет напечатано расположение сохраненных общих указателей, созданных классом и функцией. Здесь был определен класс с конструктором, который будет использоваться для создания общего указателя. Была объявлена ​​функция для создания общего указателя и печати местоположения общего указателя с помощью функции get (). В этом коде первый общий указатель был создан с использованием класса, второй общий указатель был создан с помощью функции, а третий общий указатель был создан путем присвоения первого указателя.

// Включаем необходимые библиотеки

#включают

#включают

usingnamespacestd;

// Определяем класс
classMyClass
{
общественный:
// Объявляем конструктор
Мои занятия() {
Стоимость<<'Вызывается конструктор. п';
}
};
// Определяем функцию для инициализации указателя
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
Стоимость<<p2.получать() <<' п';
}

intmain()
{
// Инициализируем shared_ptr, вызывая конструктор
shared_ptr p1знак равноshared_ptr(newMyClass);
Стоимость<<p1.получать() <<' п';

// Инициализируем shared_ptr, вызывая функцию
Init_shared_ptr();

// Инициализируем shared_ptr присвоением
shared_ptr p3знак равноp1;
Стоимость<<p3.получать() <<' п';
return0;
}

Выход:



Следующий аналогичный вывод появится после выполнения вышеуказанного кода. На выходе возвращаемое значение функции get () для первого и третьего общих указателей одинаково. Однако второй общий указатель отличается:

Пример 3: Подсчет общих объектов-указателей

В следующем примере показан способ подсчета количества объектов, на которые указывает общий указатель, после создания и уничтожения указателя. В коде объявлен класс с конструктором. Первый общий указатель был создан с использованием класса, а второй общий указатель был создан с использованием первого общего указателя. Количество объектов, на которые указывают оба общих указателя до и после вызова функции reset (), было напечатано позже.

// Включаем необходимые библиотеки

#включают

#включают

usingnamespacestd;
// Определяем класс
classMyClass{
общественный:
// Объявляем конструктор
Мои занятия() {
Стоимость<<'Вызывается конструктор. п';
}
};
intmain()
{
// Инициализируем первый shared_ptr, вызывая конструктор
shared_ptr p1(newMyClass);

// Отображение количества объектов shared_ptr по первому указателю
Стоимость<<'p1 указывает на'<<p1.use_count() <<' объекты). п';
// Инициализируем второй shared_ptr, используя первый shared_ptr
shared_ptr p2(p1);
// Отображаем количество объектов shared_ptr по первому и второму указателям
Стоимость<<'p2 указывает на'<<p2.use_count() <<' объекты). п';
Стоимость<<'p1 указывает на'<<p1.use_count() <<' объекты). п';
// Удаляем владение первым указателем из объекта shared_ptr
p1.сброс настроек();
// Отображение количества объектов shared_ptr по второму указателю
Стоимость<<'p2 указывает на'<<p2.use_count() <<' объекты). п';
return0;
}

Выход:

Следующий вывод появится после выполнения вышеуказанного кода. Первый указатель, p1 , указывает на один объект после создания. После создания второго указателя p2 , используя первый указатель, p1 , оба указателя указывают на два объекта для совместного использования указателя. После вызова функции reset () для указателя, p1 , один объект был уничтожен, а указатель, p2 , теперь указывает только на один объект.

Заключение:

Цели использования общего указателя в C ++ были объяснены в этом руководстве на простых примерах. Создание общих указателей различными способами, получение сохраненного местоположения общего указателя и подсчет количества объектов, на которые указывают общие указатели. Я надеюсь, что программисты C ++ смогут использовать общий указатель в своем коде после прочтения этого руководства.