Shared_ptr является один тип смарт — указатели на C ++, который содержит общие права собственности на объект, созданный с помощью указателя. Он разделяет владение объектом при сохранении указателя на другой объект, а общий счетчик ссылок подсчитывает количество владельцев. Shared_ptr увеличивает счетчик ссылок на единицу после копирования объекта и уменьшает счетчик ссылок на единицу после разрушения объекта. Память, принадлежащая объекту, перераспределяется, если объект, принадлежащий последнему shared_ptr, уничтожается или вызывается функция reset () для назначения другого указателя для объекта. Когда shared_ptr не владеет каким-либо объектом, он называется пустым общим указателем. Различные варианты использованияshared_ptr были показаны в этом руководстве.
Пример 1: объявить общий указатель разными способами
В следующем примере показаны три различных способа объявления общего указателя. В коде объявлены класс с конструктором и публичный метод. Конструктор напечатает сообщение, когда с помощью конструктора будет создан новый общий объект. Метод Display () будет печатать сообщения на основе вызывающего объекта общего указателя. Здесь первый объект общего указателя был создан без вызова конструктора. Второй объект общего указателя был создан путем вызова конструктора. Третий общий указатель создан путем присвоения первого общего указателя. Метод Display () был вызван трижды с использованием трех объектов общего указателя.
//Include necessary libraries
#include <iostream>
#include <memory>
usingnamespacestd;
//Define the class
classMyClass {
public:
//Declare the constructor
MyClass() {
cout<<«The constructor is called.\n«;
}
//Declare a method to print text
voidDisplay(string str)
{
cout<<«The Display() method is called from the «<< str <<» pointer.\n«;
}
};intmain()
{
//Initialize shared_ptr without calling constructor
shared_ptr p1 = make_shared();
p1->Display(«first»);
//Initialize shared_ptr by calling constructor
shared_ptr p2 = shared_ptr(newMyClass);
p2->Display(«second»);//Initialize shared_ptr by assignment
shared_ptr p3 = p1;
p3->Display(«third»);
return0;
}
Выход:
Следующий вывод появится после выполнения вышеуказанного кода. Конструктор был вызван только во время создания второго объекта. Итак, сообщение конструктора было напечатано только один раз:
Пример 2: Распечатать сохраненное местоположение общего указателя
Общий указатель функции get () используется для возврата сохраненного местоположения общего указателя. В следующем примере будет напечатано расположение сохраненных общих указателей, созданных классом и функцией. Здесь был определен класс с конструктором, который будет использоваться для создания общего указателя. Была объявлена функция для создания общего указателя и печати местоположения общего указателя с помощью функции get (). В этом коде первый общий указатель был создан с использованием класса, второй общий указатель был создан с помощью функции, а третий общий указатель был создан путем присвоения первого указателя.
//Include necessary libraries
#include <iostream>
#include <memory>
usingnamespacestd;
//Define the class
classMyClass
{
public:
//Declare the constructor
MyClass() {
cout<<«The constructor is called.\n«;
}
};
//Define function to initialize the pointer
voidInit_shared_ptr()
{
shared_ptr p2 (newMyClass);
cout<<p2.get() <<«\n«;
}intmain()
{
//Initialize shared_ptr by calling constructor
shared_ptr p1 = shared_ptr(newMyClass);
cout<<p1.get() <<«\n«;//Initialize shared_ptr by calling function
Init_shared_ptr();//Initialize shared_ptr by assignment
shared_ptr p3 = p1;
cout<<p3.get() <<«\n«;
return0;
}
Выход:
Следующий аналогичный вывод появится после выполнения вышеуказанного кода. На выходе возвращаемое значение функции get () для первого и третьего общих указателей одинаково. Однако второй общий указатель отличается:
Пример 3: Подсчет общих объектов-указателей
В следующем примере показан способ подсчета количества объектов, на которые указывает общий указатель, после создания и уничтожения указателя. В коде объявлен класс с конструктором. Первый общий указатель был создан с использованием класса, а второй общий указатель был создан с использованием первого общего указателя. Количество объектов, на которые указывают оба общих указателя до и после вызова функции reset (), было напечатано позже.
//Include necessary libraries
#include <iostream>
#include <memory>
usingnamespacestd;
//Define the class
classMyClass {
public:
//Declare the constructor
MyClass() {
cout<<«The constructor is called.\n«;
}
};
intmain()
{
//Initialize the first shared_ptr by calling constructor
shared_ptr p1(newMyClass);//Display the number of shared_ptr objects by the first pointer
cout<<«p1 pointing to «<< p1.use_count() <<» object(s).\n«;
//Initialize the second shared_ptr using the first shared_ptr
shared_ptr p2(p1);
//Display the number of shared_ptr objects by the first and second pointers
cout<<«p2 pointing to «<< p2.use_count() <<» object(s).\n«;
cout<<«p1 pointing to «<< p1.use_count() <<» object(s).\n«;
//Remove the ownership of the first pointer from the shared_ptr object
p1.reset();
//Display the number of shared_ptr objects by the second pointer
cout<<«p2 pointing to «<< p2.use_count() <<» object(s).\n«;
return0;
}
Выход:
Следующий вывод появится после выполнения вышеуказанного кода. Первый указатель p1 указывает на один объект после создания. После создания второго указателя p2 с использованием первого указателя p1 оба указателя указывают на два объекта для совместного использования указателя. После вызова функции reset () для указателя p1 один объект был уничтожен, а указатель p2 теперь указывает только на один объект.
Заключение
Цели использования общего указателя в C ++ были объяснены в этом руководстве на простых примерах. Создание общих указателей различными способами, получение сохраненного местоположения общего указателя и подсчет количества объектов, на которые указывают общие указатели. Я надеюсь, что программисты C ++ смогут использовать общий указатель в своем коде после прочтения этого руководства.