close
Пространства имён
Варианты
Действия

std::shared_ptr::get

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
 
<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 функция-элемент) [править]