std::shared_ptr<T>::get

来自cppreference.com
< cpp‎ | memory‎ | shared ptr
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(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)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集器支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)



 
 
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

参阅

解引用存储的指针
(公开成员函数)