C++的智能指针

说实话以前用这个很少,一个指针打天下,不过都智能了,分配了就不管了,想来还是很方便。。。

1 unique_ptr

代码示例:

#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass constructor\n"; }~MyClass() { std::cout << "MyClass destructor\n"; }void display() { std::cout << "Displaying MyClass\n"; }
};int main() {std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); // 创建智能指针ptr1->display();// 转移所有权std::unique_ptr<MyClass> ptr2 = std::move(ptr1);if (!ptr1) {std::cout << "ptr1 is null\n";}ptr2->display();// 自动释放内存return 0;
}

结果:

ubuntu@VM-8-10-ubuntu:~/test/cpp$ ./a.out
MyClass constructor
Displaying MyClass
ptr1 is null
Displaying MyClass
MyClass destructor

2 shared_ptr

代码示例:

#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass constructor\n"; }~MyClass() { std::cout << "MyClass destructor\n"; }void display() { std::cout << "Displaying MyClass\n"; }
};int main() {std::shared_ptr<MyClass> ptr1 = std::make_shared<MyClass>(); // 创建智能指针ptr1->display();{std::shared_ptr<MyClass> ptr2 = ptr1; // 共享所有权std::cout << "ptr2 use count: " << ptr2.use_count() << "\n";ptr2->display();} // ptr2超出作用域,不影响对象的生存std::cout << "ptr1 use count: " << ptr1.use_count() << "\n";// 自动释放内存return 0;
}

结果:

ubuntu@VM-8-10-ubuntu:~/test/cpp$ ./a.out
MyClass constructor
Displaying MyClass
ptr2 use count: 2
Displaying MyClass
ptr1 use count: 1
MyClass destructor

3 weak_ptr

代码示例:

#include <iostream>
#include <memory>class MyClass {
public:MyClass() { std::cout << "MyClass constructor\n"; }~MyClass() { std::cout << "MyClass destructor\n"; }void display() { std::cout << "Displaying MyClass\n"; }
};int main() {std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>(); // 创建智能指针std::weak_ptr<MyClass> weakPtr = sharedPtr; // 创建弱引用std::cout << "sharedPtr use count: " << sharedPtr.use_count() << "\n";if (auto tempPtr = weakPtr.lock()) { // 转换为std::shared_ptrtempPtr->display();std::cout << "tempPtr use count: " << tempPtr.use_count() << "\n";} else {std::cout << "Object is no longer available\n";}sharedPtr.reset(); // 释放sharedPtrif (auto tempPtr = weakPtr.lock()) { // 再次尝试转换tempPtr->display();} else {std::cout << "Object is no longer available\n";}return 0;
}

结果

ubuntu@VM-8-10-ubuntu:~/test/cpp$ ./a.out
MyClass constructor
sharedPtr use count: 1
Displaying MyClass
tempPtr use count: 2
MyClass destructor
Object is no longer available

4 小结

名称用法

unique_ptr

指向单一结构,比如分配的数组,链表,一个设备等等。

shared_ptr

需要多个类都操作这个数据。比如说结构在多个类都要用。然后就是工厂类肯定要用。观察者也会用到。

weak_ptr

主要是解决shared_ptr会出现的循环引用,导致内存泄漏的问题。

感觉刚开始用unique_ptr就够了,实在解决不了的场景再看看。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 开源项目热度排行榜(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 93 分 最新华为OD机试目录…

Linux网络-配置IP

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 本来IP配置应该放在Linux安装完成的就要配置的&#xff0c;但是由于那个时候对Linux不怎么熟悉&#xff0c;所以单独列了一个…

JVM系列(一) -浅谈虚拟机的成长史

一、摘要 众所周知&#xff0c;Java 经过多年的发展&#xff0c;已经从一门单纯的计算机编程语言&#xff0c;发展成了一套成熟的软件解决方案。从互联网到企业平台&#xff0c;Java 是目前使用最广泛的编程语言。 以下这段内容是来自 Java 的官方介绍&#xff01; 从笔记本电…

图片变更检测

20240723 By wdhuag 目录 前言&#xff1a; 参考&#xff1a; 文件监控&#xff1a; 图片占用问题&#xff1a; 源码&#xff1a; 前言&#xff1a; 由于第三方图像处理软件不能回传图片&#xff08;正常都能做&#xff0c;这里只是不想做&#xff09;&#xff0c;只能在…

Postman接口测试工具的使用

一、postman简介 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。作用&#xff1a;常用于进行接口测试。不需要安装。 特征&#xff1a;简单&#xff0c;实用&#xff0c;美观&#xff0c;大方。 二、Postman接口测试工具的使用 Postman不需要安…

Emacs vs IDE:用Emacs写程序真的更方便吗?

前言 在程序员的世界里&#xff0c;选择合适的开发工具至关重要。Emacs作为一种历史悠久且功能强大的文本编辑器&#xff0c;因其灵活性和扩展性吸引了许多程序员。那么&#xff0c;Emacs究竟有哪些优点&#xff1f;用Emacs写程序真的比使用现代IDE更方便吗&#xff1f;本文将…

MySQL的账户管理

目录 1 密码策略 1.1 查看数据库当前密码策略&#xff1a; 1.2 查看密码设置策略 1.3 密码强度检查等级解释&#xff08;validate_password.policy&#xff09; 2 新建登录账户 3 账户授权 3.1 赋权原则 3.2 常见的用户权限 3.3 查看权限 3.4 赋权语法 4 实例 4.1 示例1&#x…

python脚本制作循环执行命令行

python import subprocess import sysif __name____main__:ret 1while ret!0:ret subprocess.call(sys.argv[1:], textTrue)pack pip install pyinstaller pyinstaller --onefile loop.py 使用场景 使用上面生成的loop.exe调用cmd命令&#xff0c;执行失败了返回值&#xf…

项目实战二

Git 服务器 公共代码平台GitLab 配置gitlab 1.设置管理员帐号密码 2.让程序员传代码到20主机上需要配置&#xff1a; 创建用户 mark 1234.com 创建用户组devops 然后把mark 添加到devons 创建项目 http://192.168.88.20/devops/myproject.git 3.客户端操作&#x…

Spring Boot下数据隐私守护者:四大脱敏策略实战解析

文章目录 SpringBoot数据脱敏的四种实现方案数据脱敏概述什么是数据脱敏数据脱敏的分类 Spring Boot 实现数据脱敏的常见方案统一的脱敏处理工具类自定义注解与拦截器AOP&#xff08;面向切面编程&#xff09;Jackson 自定义序列化MyBatis 拦截器 详细案例使用自定义注解与拦截…

textblob文本处理、词性分析与情感分析

1 前言 textBlob 是一個简单易用的 NLP库&#xff0c;基于 NLTK 和 pattern库&#xff0c; 提供了文本处理和情感分析等功能。 安装 textblob0.18.0 nltk3.8.1测试环境&#xff1a;Python3.10.9 使用前&#xff0c;先运行下面代码先下载些文件 import nltk nltk.download…

C#医学影像管理系统源码 PACS系统源码带三维重建,全院级数字医学影像系统

C#医学影像管理系统源码 医学影像存储与传输系统源码 PACS系统源码带三维重建&#xff0c;三甲以下医院都能满足。 PACS系统模块组成 &#xff1a; 工作站&#xff1a; 分诊工作站、超声工作站、放射工作站、内镜工作站、病理工作站。 基本信息维护&#xff1a; 输入模板、输入…

C语言从头学37——struct 指针

在前文学习结构体变量的声明时&#xff0c;曾介绍过结构体指针变量的使用。这里介绍结构体指针&#xff0c;目的是找出在函数中处理作为参数的结构体变量的方法。 一、先看一个普通结构体变量作为参数的程序 typedef struct { int a; } myInt; //定义结构体别名&#xff08;别…

Milvus 核心组件(3)--- MinIO详解

目录 背景 MinIO 安装 docker desktop 安装 Ubuntu UI 在 docker 中的安装 Minio 下载及安装 启动minio docker image 保存 启动 minio web 网页 下一次启动 MinIO基本概念 基本概述 主要特性 应用场景 MinIO 使用 连接server 创建bucket 查询bucket 上传文件…

Springboot集成Nacos配置

参考文档 Nacos 融合 Spring Boot&#xff0c;成为注册配置中心 | Nacos 官网​​​​​​​ 版本 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.1.RELE…

Layer2区块链扩容方案(1)——总述

写在前面 这篇文章作为一个简单介绍&#xff0c;很多技术只是大致提及或者引用&#xff0c;之后会在详细学习后逐项解释。 补充知识 在了解扩容方案之前&#xff0c;我们最好了解一些相关的知识概念 EVM “EVM” 是“Ethereum Virtual Machine”&#xff08;以太坊虚拟机&…

相机的内参与外参

目录 一、相机的内参二、相机的外参 一、相机的内参 如下图所示是相机的针孔模型示意图&#xff1a; 光心O所处平面是相机坐标系(O&#xff0c;P)&#xff0c;像素平面所在坐标系为像素坐标系(O’&#xff0c;P’)。 焦距f&#xff1a;O到O’的距离 相机的内参表示的是相机坐标…

100个python的基本语法知识【上】

0. 变量和赋值&#xff1a; x 5 name “John” 1. 数据类型&#xff1a; 整数&#xff08;int&#xff09; 浮点数&#xff08;float&#xff09; 字符串&#xff08;str&#xff09; 布尔值&#xff08;bool&#xff09; 2. 注释&#xff1a; # 这是单行注释 ""…

SQL Server数据迁移新纪元:数据库数据泵(Data Pump)使用指南

SQL Server数据迁移新纪元&#xff1a;数据库数据泵&#xff08;Data Pump&#xff09;使用指南 在数据管理的世界里&#xff0c;数据迁移是一个常见且复杂的过程。SQL Server提供了一个强大的工具——数据库数据泵&#xff08;Data Pump&#xff09;&#xff0c;它可以帮助我…

mysql面试(三)

MVCC机制 MVCC&#xff08;Multi-Version Concurrency Control&#xff09; 即多版本并发控制&#xff0c;了解mvcc机制&#xff0c;需要了解如下这些概念 事务id 事务每次开启时&#xff0c;都会从数据库获得一个自增长的事务ID&#xff0c;可以从事务ID判断事务的执行先后…