std::shared_ptr::get
Материал из cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
T* get() const noexcept; |
(до C++17) | |
element_type* get() const noexcept; |
(начиная с C++17) | |
Возвращает сохранённый указатель.
Параметры
(нет)
Возвращаемое значение
Сохранённый указатель.
Примечание
shared_ptr может совместно владеть объектом, сохраняя при этом указатель на другой объект. get() возвращает сохранённый указатель, а не управляемый указатель.
Пример
Запустить этот код
#include <iostream>
#include <memory>
#include <string_view>
int main()
{
auto output = [](std::string_view msg, int const* pInt) {
std::cout << msg << *pInt << " в " << pInt << '\n';
};
int* pInt = new int(42);
std::shared_ptr<int> pShared = std::make_shared<int>(42);
output("Голый указатель: ", pInt);
// output("Общий указатель: ", pShared); // ошибка компилятора
output("Общий указатель: ", &*pShared); // OK, вызывает operator*, затем берёт адрес
output("Общий указатель с get(): ", pShared.get());
delete pInt;
std::cout << "\nДемонстрация конструктора псевдонимов shared_ptr.\n";
struct Base1 { int i1{}; };
struct Base2 { int i2{}; };
struct Derived : Base1, Base2 { int i3{}; };
std::shared_ptr<Derived> p(new Derived());
std::shared_ptr<Base2> q(p, static_cast<Base2*>(p.get()));
std::cout << "q разделяет право собственности с p, но указывает на подобъект Base2:\n"
<< "p.get(): " << p.get() << '\n'
<< "q.get(): " << q.get() << '\n'
<< "&(p->i1): " << &(p->i1) << '\n'
<< "&(p->i2): " << &(p->i2) << '\n'
<< "&(p->i3): " << &(p->i3) << '\n'
<< "&(q->i2): " << &(q->i2) << '\n';
}
Возможный вывод:
Голый указатель: 42 в 0xacac20
Общий указатель: 42 в 0xacac50
Общий указатель с get(): 42 в 0xacac50
Демонстрация конструктора псевдонимов shared_ptr.
q разделяет право собственности с p, но указывает на подобъект Base2:
p.get(): 0xacac20
q.get(): 0xacac24
&(p->i1): 0xacac20
&(p->i2): 0xacac24
&(p->i3): 0xacac28
&(q->i2): 0xacac24
Смотрите также
| разыменовывает сохранённый указатель (public функция-элемент) |