当前位置: 首页 > news >正文

【C++ Primer 学习札记】智能指针

1)std::unique_ptr(独占所有权)

特点:

独占资源的所有权,同一时间只能有一个 unique_ptr 指向特定对象。

不可复制,但可以通过 std::move 转移所有权。

轻量级,几乎无额外开销(与裸指针性能接近)。

2)std::shared_ptr(共享所有权)

特点:

通过引用计数实现多个指针共享同一资源。

当最后一个 shared_ptr 被销毁时,资源自动释放。

支持自定义删除器(如文件句柄、网络连接等)。

3)std::weak_ptr(弱引用)

特点:

不拥有资源的所有权,不增加引用计数。

需通过 lock() 方法转换为 shared_ptr 以访问资源(防止访问已释放对象)。

测试用例

weak_ptr解决循环引用和lock获取shared_ptr

class B; // 前向声明class A
{
public:std::shared_ptr<B> b_ptr;A() { std::cout << "A 构造" << std::endl; }~A() { std::cout << "A 析构" << std::endl; }void who(){ std::cout << "I'm A " << std::endl; }
};class B
{
public:std::weak_ptr<A> a_ptr; // 使用 weak_ptr 替代 shared_ptrB() { std::cout << "B 构造" << std::endl; }~B() { std::cout << "B 析构" << std::endl; }void who(){ std::cout << "I'm B " << std::endl; }
};int main(int argc, char *argv[])
{auto a = std::make_shared<A>();auto b = std::make_shared<B>();a->b_ptr = b;b->a_ptr = a; // 不会增加引用计数if (auto spt = b->a_ptr.lock()){ // 转换为 shared_ptrspt->who();}else{std::cout << "对象已被释放" << std::endl;}// 退出作用域时,a 和 b 都能正常析构return 0;
}

shared_ptr和unique_ptr的初始化

class Test
{public:Test(int time = 0) : time_(time){std::cout << "Test: " << time_ << std::endl;}~Test(){std::cout << "~Test: " << time_ << std::endl;}int time_;
};int main(int argc, char *argv[])
{std::shared_ptr<Test> p0 = std::make_shared<Test>(1);std::unique_ptr<Test> p1;p1.reset(new Test(-1));std::unique_ptr<Test> p2(new Test);//p1 = p2;//error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>& std::unique_ptr<_Tp, _Dp>::operator=(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Test; _Dp = std::default_delete<Test>]’return 0;
}

http://www.xdnf.cn/news/569215.html

相关文章:

  • 构建 PyMNN
  • Halcon窗口的基本操作
  • Elasticsearch生产环境性能调优指南
  • Spring Boot + +小程序, 快速开发零工市场小程序
  • 如何使用 Docker Compose 部署 Immich
  • 《棒球百科知识》世界棒球十强国家是如何发展·棒球1号位
  • WordPress Madara插件存在文件包含漏洞(CVE-2025-4524)
  • 实验分享|基于千眼狼sCMOS科学相机的流式细胞仪细胞核成像实验
  • XCOSnTh-fatfsShell
  • 腾讯位置服务地点搜索开发指南
  • [Min-Max Normalization] [Z-Score Normalization]
  • 使用vue2做一个生成二维码的案例【可当组件使用】
  • JC/T 2848-2024 玻璃纤维增强石膏(GRG)装饰制品检测
  • VS2022:使用命令行启动项目
  • 2023 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 解题报告 | 珂学家
  • vscode连接WSL卡住
  • js不同浏览器标签页、窗口或 iframe 之间可以相互通信
  • 虚拟机下的OpenWrt磁盘Overlay扩容
  • genicamtl_lmi_gocator_objectmodel3d
  • 掌握HTTPX:从基础到高并发工程实践
  • 自由开发者计划 001:创建一个用于查看 Jupyter Notebook 的谷歌浏览器插件
  • FPGA降低功耗研究
  • 【76. 最小覆盖子串】
  • 操作系统 第四章 -2
  • Docker安装MinIO对象存储中间件
  • 图片识别(TransFormerCNNMLP)
  • 分享一些多模态文档解析思路
  • 蓝桥杯3503 更小的数
  • polarctf-web-[某函数的复仇]
  • 基于python的机器学习(七)—— 数据特征选择