Skip to content

std::shared_ptr(C++11)

一句话

多个智能指针可以共同拥有同一个对象,当最后一个拥有者被销毁或重置时,对象才会自动释放。

头文件

#include <memory>

核心 API 速查

操作签名说明
构造shared_ptr()构造空指针(默认)
构造(工厂)template<class T, class... Args> shared_ptr<T> make_shared(Args&&... args)分配并构造对象(C++11)
重置void reset()释放当前管理对象的所有权
获取原始指针T* get() const noexcept返回存储的指针
解引用T& operator*() const noexcept解引用存储的指针
箭头操作T* operator->() const noexcept通过指针访问成员
引用计数long use_count() const noexcept返回共享该对象的 shared_ptr 数量
布尔转换explicit operator bool() const noexcept检查是否管理非空对象
交换void swap(shared_ptr& r) noexcept交换两个 shared_ptr 管理的对象

最小示例

cpp
#include <iostream>
#include <memory>
struct Foo { Foo() { std::cout << "Foo()\n"; } ~Foo() { std::cout << "~Foo()\n"; } };
int main() {
    std::shared_ptr<Foo> p1 = std::make_shared<Foo>();
    std::shared_ptr<Foo> p2 = p1; // 引用计数变为 2
    std::cout << "count: " << p1.use_count() << "\n";
    p1.reset(); // count: 1
    p2.reset(); // 析构 Foo
}

嵌入式适用性:中

  • 内部维护控制块和原子引用计数,存在额外的内存和 CPU 开销
  • 拷贝操作本身是线程安全的,适合多任务间共享资源
  • 在 RAM 和 Flash 极度受限的单片机上应谨慎使用,优先考虑 unique_ptr

编译器支持

GCCClangMSVC
待补充待补充待补充

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建