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

C++智能指针举例

C++智能指针

C++11标准引入了智能指针,旨在自动管理动态内存,避免内存泄漏和悬挂指针问题。C++标准库提供了三种主要的智能指针类型:std::unique_ptr、std::shared_ptr和std::weak_ptr。

  • std::unique_ptr:适用于独占所有权的场景,不可复制但可移动,适用于单一对象的管理。
  • std::shared_ptr:适用于共享所有权的场景,使用引用计数管理对象生命周期,可复制,适用于跨范围的对象管理。
  • std::weak_ptr:不拥有对象,仅仅是一个观察者,适用于需要解决std::shared_ptr循环引用问题的场景

下面分别介绍它们的使用场景及示例代码

1. std::unique_ptr

std::unique_ptr 是一种独占所有权的智能指针,确保同一时刻只能有一个智能指针拥有对象的所有权。当std::unique_ptr对象销毁时,它所管理的对象也会被自动销毁。

适用场景:

  • 独占所有权的场景。
  • 对象生命周期在单一范围内(如单一函数或单一类)管理。
#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass Constructor\n"; }~MyClass() { std::cout << "MyClass Destructor\n"; }void sayHello() { std::cout << "Hello from MyClass\n"; }
};int main() {std::unique_ptr<MyClass> ptr1(new MyClass());ptr1->sayHello();// std::unique_ptr<MyClass> ptr2 = ptr1; // Error: can't copy unique_ptrstd::unique_ptr<MyClass> ptr2 = std::move(ptr1); // Transfer ownershipif (!ptr1) {std::cout << "ptr1 is now empty\n";}ptr2->sayHello();return 0;
}

2. std::shared_ptr

std::shared_ptr 是一种共享所有权的智能指针,多个智能指针可以共同拥有同一个对象。对象在最后一个所有者销毁时被自动销毁。std::shared_ptr内部使用引用计数来管理对象的生命周期。

适用场景:

  • 需要共享所有权的场景。
  • 对象需要跨多个范围或模块共享。
#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass Constructor\n"; }~MyClass() { std::cout << "MyClass Destructor\n"; }void sayHello() { std::cout << "Hello from MyClass\n"; }
};void useSharedPtr(std::shared_ptr<MyClass> ptr) {ptr->sayHello();std::cout << "useSharedPtr: Use count is " << ptr.use_count() << '\n';
}int main() {std::shared_ptr<MyClass> ptr1(new MyClass());std::cout << "main: Use count is " << ptr1.use_count() << '\n';useSharedPtr(ptr1);std::cout << "main: Use count is " << ptr1.use_count() << '\n';return 0;
}

3. std::weak_ptr

std::weak_ptr 是一种不拥有所有权的智能指针,它不影响所指对象的引用计数。std::weak_ptr必须从一个std::shared_ptr创建,用于解决循环引用问题。

适用场景:

  • 需要观察但不拥有对象的场景。
  • 解决循环引用问题。
#include <iostream>
#include <memory>class MyClass;class B;class MyClass {
public:std::shared_ptr<B> b_ptr;~MyClass() { std::cout << "MyClass Destructor\n"; }
};class B {
public:std::weak_ptr<MyClass> my_class_ptr;~B() { std::cout << "B Destructor\n"; }
};int main() {{auto a = std::make_shared<MyClass>();auto b = std::make_shared<B>();a->b_ptr = b;b->my_class_ptr = a; // No cycle, because weak_ptr doesn't affect reference count} // Both a and b are properly destroyed herestd::cout << "End of main\n";return 0;
}

相关文章:

  • LabVIEW与Python的比较及联合开发
  • 编程机器人的参数表怎么看
  • 【Python】在运行中使用warnings.filterwarnings,可以忽略测试中遇到的问题
  • 【数学】什么是方法矩估计?和最大似然估计是什么关系?
  • 用C语言实现扫雷
  • 基于python实现视频和音频长度对齐合成并添加字幕
  • ubuntu gitlab 部署 私有git库
  • 银河麒麟系统安装
  • 为什么javascript中数组可以存储不同类型的元素,而大多编程语言数组必须存储相同的元素?
  • LeetCode-day11-2813. 子序列最大优雅度
  • 每日一题——Python实现PAT乙级1012 数字分类(举一反三+思想解读+逐步优化)五千字好文
  • 基于YOLO检测算法(单检测器网络+多视频输入)设计与实现
  • pdf格式转成jpg图片,pdf格式如何转jpg
  • 网络安全等级保护基本要求解读- 安全计算环境-应用系统和数据安全
  • 19.2 HTTP客户端-定制HTTP请求、调试HTTP、响应超时
  • css选择器
  • GraphQL学习过程应该是这样的
  • Java应用性能调优
  • js写一个简单的选项卡
  • vue 配置sass、scss全局变量
  • vue总结
  • yii2中session跨域名的问题
  • 半理解系列--Promise的进化史
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 如何设计一个比特币钱包服务
  • 如何胜任知名企业的商业数据分析师?
  • 译自由幺半群
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​Python 3 新特性:类型注解
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (3)STL算法之搜索
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十八)三元表达式和列表解析
  • (原)Matlab的svmtrain和svmclassify
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .gitignore文件_Git:.gitignore
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .net 程序发生了一个不可捕获的异常
  • .NET/C# 使窗口永不获得焦点
  • .NET文档生成工具ADB使用图文教程
  • @Bean注解详解
  • @JoinTable会自动删除关联表的数据
  • @staticmethod和@classmethod的作用与区别
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [ACM] hdu 1201 18岁生日
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [BZOJ4010]菜肴制作
  • [C#]猫叫人醒老鼠跑 C#的委托及事件