重学C++系列之智能指针简单介绍
一、什么是智能指针
在使用堆内存时,就像使用栈内存空间一样,可以实现自释放的功能,智能指针在C++库中也是类模板之一。
二、智能指针有几种
有四种。auto_ptr, unique_ptr, shared_ptr, weak_ptr 其中后三个是C++11支持,第一个已经被C++弃用且被unique_ptr 代替,不推荐使用。
1、unique_ptr, 实现了独占式拥有的概念,同一个时间只能有一个智能指针可以指向该对象,因为无法进行拷贝构造和拷贝赋值,但是可以进行移动构造和移动赋值。
2、share_ptr, 实现了共享式拥有的概念,即多个智能指针可以指向相同的对象,该对象及相关资源会在其所指对象不再使用之后,自己释放与对象相关的资源。
3、weak_ptr, 解决share_ptr相互引用时,两个指针的引用计数永远不会下降为0,从而导致死锁问题。而weak_ptr 是对对象的一种弱引用,可以绑定share_ptr, 但不会增加对象的引用计数。
4、atuo_ptr, 实现独占式拥有的概念,同一时间只能有一个智能指针可以指向该对象;但atuo_ptr在C++17中被摒弃,其主要问题在于:对象所有权的转移,比如在函数传参过程中,对象所有权不会返还,从而存在潜在的内存崩溃问题;不能指向数组,也不能作为STL容器的成员。
三、智能指针的特点
1、在C++库中也是类模板之一。
2、实际上将指针封装在一个类,通过对象来管理指针。
3、作用主要用来管理内存,在C++中,是一种管理资源,避免泄漏内存的习惯用法,也称RAII(资源获取及初始化)
四、案例
1、auto_ptr的简单实现
#include <iostream>using namespace std;class Test1 { private:int a; public:Test1(int a = 0){cout << "Test1()" << endl;this->a = a;}~Test1(){cout << "~Test1()" << endl;}void show(){cout << "a = " << a << endl;} };class Test2 { private:int a; public:Test2(int a = 0){cout << "Test2()" << endl;this->a = a;}~Test2(){cout << "~Test2()" << endl;}void show(){cout << "a = " << a << endl;} };template <class T> class myauto_ptr { private:T *ptr; public:// 使用类模板的方式来适应多个类myauto_ptr(T *ptr = T ()){this->ptr = ptr;}~myauto_ptr(){delete ptr; // 重点在这里cout << "~myauto_ptr" << endl;}// 重载成员函数, 让本类的指针成员变量可以调用T类对象的成员函数T* operator ->(){return ptr;}T& operator *(){return *ptr;} };int main() {Test1 *p1 = new Test1(10);// delete p1; // 如果没有这步,会造成内存泄漏Test2 *p2 = new Test2(20);myauto_ptr<Test1> p3(new Test1(100));myauto_ptr<Test2> p4(new Test2(200));p3->show();(*p4).show();return 0; }
2、share_ptr的简单实现
#include <iostream>using namespace std;// 定义一个共享的全局变量,用来描述指向某个对象的指针个数 int share_count = 1; class Test1 { private:int a; public:Test1(int a = 0){cout << "Test1()" << endl;this->a = a;}~Test1(){cout << "~Test1()" << endl;}void show(){cout << "a = " << a << endl;} };template <class T> class myshare_ptr { private:T *ptr; public:// 使用类模板的方式来适应多个类myshare_ptr(T *ptr = T ()){this->ptr = ptr;}~myshare_ptr(){cout << "count :" << share_count-1 << endl;if(this->ptr != nullptr && --share_count == 0){delete ptr; // 重点在这里}cout << "~myshare_ptr" << endl;}myshare_ptr(const myshare_ptr& other){this->ptr = other.ptr;share_count++;}T& operator = (const myshare_ptr& other){share_count++;this->ptr = other.ptr;return *this->ptr;}// 重载成员函数, 让本类的指针成员变量可以调用T类对象的成员函数T* operator ->(){return ptr;}T& operator *(){return *ptr;} };int main() {Test1 *p1 = new Test1(10);// delete p1; // 如果没有这步,会造成内存泄漏myshare_ptr<Test1> p2(new Test1(100));myshare_ptr<Test1> p3 = p2;myshare_ptr<Test1> p4 = p2;p3->show();return 0; }
五、总结
本篇只是简单讲解一下四种智能指针,并简单实现了两个简单的案例,实际使用中还是用C++提供的智能指针。了解内部原理有助于正确使用。
相关文章:
重学C++系列之智能指针简单介绍
一、什么是智能指针 在使用堆内存时,就像使用栈内存空间一样,可以实现自释放的功能,智能指针在C库中也是类模板之一。 二、智能指针有几种 有四种。auto_ptr, unique_ptr, shared_ptr, weak_ptr 其中后三个是C11支持,第一个已经被…...
LabVIEW开发航天器动力学与控制仿真系统
LabVIEW开发航天器动力学与控制仿真系统 计算机仿真是工程设计和验证的非常有用的工具。它节省了大量的时间、金钱和精力。航天器动力学与控制仿真系统由LabVIEW程序开发,它是模拟航天器等动态系统的有用工具。还可轻松与硬件连接并输出真实信号。 项目采用系统工…...
享元模式——实现对象的复用
1、简介 1.1、概述 当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。例如,在一个文本字符串中存在很多重复的字符,如果每个字符都用一个单独的对象来表示,将会占用较多的内存…...
【GreenDao】关联表实现,父表关联多个子表
要在GreenDao中实现温湿度采集器表和采集数据表的关联,并在删除温湿度表时同时删除对应的采集数据,可以按照以下步骤进行操作: 在GreenDao的实体类中定义温湿度采集器表(Parent Table)和采集数据表(Child …...
python网站创建005:数据交互
目标:本章讲解不同控件下, 数据在前端和后端之间的交互 控件有: 输入框 密码输入框 单选框 多选框 下拉框 多行文本框 不同控件中如何将数据传入后端?请看一下html代码 <!DOCTYPE html> <html> <head><meta …...
golang 字符串操作、处理
一、golang的字符串长度 1. len()内置系统函数,计算字符串结果是字符串的字节长度,不是字符长度 //1.ASCII字符串长度(字节长度) str1 : "wo ai zhong guo" fmt.Println(len(str1)) //15//2.带中文的字符串长度&…...
Nginx配置WebSocket反向代理
1、WebSocket协议 WebSocket协议相比较于HTTP协议成功握手后可以多次进行通讯,直到连接被关闭。但是WebSocket中的握手和HTTP中的握手兼容,它使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。这使得WebSocket程序可以更容易的使用现已存在的…...
devops(后端)
1.前言 该devpos架构为gitlabjenkinsharbork8s,项目是java项目,流程为从gitlab拉取项目代码到jenkins,jenkins通过maven将项目代码打成jar包,通过dockerfile构建jdk环境的镜像并把jar包放到镜像中启动,构建好的镜像通…...
Ubuntu安装企业微信
Ubuntu安装企业微信_ubuntu下安装企业微信_星光2020的博客-CSDN博客 在Ubuntu环境安装企业微信可以参考 https://github.com/zq1997/deepin-wine 所述的方法 首先运行 $ wget -O- https://deepin-wine.i-m.dev/setup.sh | sh 然后就可以像安装其它软件一样安装企业微信或其它…...
Prometheus 的应用服务发现及黑河部署等
目录 promtool检查语法 部署Prometheus Server 检查语法是否规范 部署node-exporter 部署Consul 直接请求API进行服务注册 使用register命令注册服务(建议使用) 单个和多个注册,多个后面多加了s 在Prometheus上做consul的服务发现 部署…...
JAVA SE -- 第十二天
(全部来自“韩顺平教育”) 常用类 一、包装类 1、包装类的分类 ①针对八种基本数据类型相应的引用类型--包装类 ②有了类的特点,就可以调用类中的方法 ③ 基本数据类型包装类booleanBooleancharCharacterbyteByteshortShortintInteger…...
实战:工作中对并发问题的处理
大家好,我是 方圆。最近在接口联调时发生了数据并发修改问题,我想把这个问题讲解一下,并把当时提出的解决方案进行实现,希望它能在大家以后在遇到同样的问题时提供一些借鉴和思考的方向。原文还是收录在我的 Github: enthusiasm 中…...
腾讯云Cloud Studio:基于Claude快速完成Excel工资自动核算
目录 1 什么是Cloud Studio?2 注册与代码管理2.1 账号注册2.2 Git关联 3 实战:Excel工资自动核算3.1 创建项目与配置3.2 “念咒师”Claude GPT3.3 代码编写与运行 1 什么是Cloud Studio? Cloud Studio是腾讯云为开发者提供的一个基于浏览器的…...
Spring Boot OAuth2 快速入门示例
系统要求 Spring Authorization Server 需要JDK1.8及以上版本。 项目搭建 使用在线项目初始化器 https://start.spring.io/ 生成项目[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ljKbMI4H-1690726855433)(images/screenshot_1690602511482.png)…...
MethodInterceptor
目录 1 MethodInterceptor 1.1 HandleSync 1.2 HandleException 1.3 /// This will be called via Reflection MethodInterceptor HandleSync private void HandleSync(IReadOnlyList<MethodFilterAttribute> filterAttributes, IReadOnlyList<ExceptionFilte…...
PID模块化__以stm32直流电机速度为例
文章目录 前言一、相关PID源码.c.h 二、如何使用1.创建变量2.初始化3.运算4.修改pid参数 总结 前言 本篇使用到的基于这个STM32CubeMX 直流电机PID速度控制、HAL库、cubemx、PID、速度控制、增量式 由于上次使用的pid没有模块化,当多出使用pid的时候就会很麻烦 所以…...
Java ~ Collection/Executor ~ DelayQueue【总结】
前言 文章 相关系列:《Java ~ Collection【目录】》(持续更新)相关系列:《Java ~ Executor【目录】》(持续更新)相关系列:《Java ~ Collection/Executor ~ DelayQueue【源码】》(学…...
前端高级面试题-安全相关
1 XSS 跨⽹站指令码(英语: Cross-site scripting ,通常简称为: XSS )是⼀种⽹站应⽤程式的安全漏洞攻击,是代码注⼊的⼀种。 它允许恶意使⽤者将程式码注⼊到⽹⻚上,其他使⽤者在观看⽹⻚时就会…...
【前缀和】560.和为 K 的子数组
Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 和为K的子数组 题目:示例:题解:解法一:解法二: 题目: 示例: 题解: 解法一: 暴力解法:我们很容易想到通过两个for循环去遍…...
【Docker】安全及日志管理
安全及日志管理 Docker 安全及日志管理一:Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 二:Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三:Docker 架构缺陷与安全机制1. 容器之间的局域网攻击2. DDoS 攻击耗尽资源3.…...
技术揭秘:SillyTavern角色卡片系统的架构设计与实战应用
技术揭秘:SillyTavern角色卡片系统的架构设计与实战应用 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 在AI角色扮演领域,如何将复杂的角色数据与视觉形象完美融合…...
思源宋体TTF:免费商用中文字体的终极解决方案
思源宋体TTF:免费商用中文字体的终极解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为寻找高质量且免费商用的中文字体而烦恼吗?思源宋体TTF格式为…...
nli-distilroberta-base在内容聚合平台中的落地:多源新闻事件一致性交叉验证
nli-distilroberta-base在内容聚合平台中的落地:多源新闻事件一致性交叉验证 1. 项目背景与价值 在信息爆炸的时代,内容聚合平台每天需要处理来自不同来源的海量新闻资讯。如何快速验证同一事件在不同报道中的一致性,成为平台内容质量管控的…...
Stable Yogi Leather-Dress-Collection 一键部署教程:基于Ubuntu的快速环境搭建
Stable Yogi Leather-Dress-Collection 一键部署教程:基于Ubuntu的快速环境搭建 最近在折腾AI图像生成,发现了一个挺有意思的模型叫Stable Yogi Leather-Dress-Collection。听名字就知道,它特别擅长生成皮革、连衣裙这类时尚单品的设计图。对…...
暗黑破坏神2终极单机优化:PlugY生存工具包完整指南
暗黑破坏神2终极单机优化:PlugY生存工具包完整指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 厌倦了暗黑破坏神2单机模式的储物空间限制?…...
Ubuntu服务器上配置KVM虚拟化环境:从零搭建Windows开发环境
1. 为什么要在Ubuntu服务器上跑Windows? 很多开发者可能都有这样的困惑:明明手头有性能强劲的Ubuntu服务器,但某些开发工具只能在Windows环境下运行。比如Visual Studio、SQL Server Management Studio这些微软系工具,或者某些行业…...
ChatGLM3-6B部署避坑指南:解决组件冲突,实现稳定运行
ChatGLM3-6B部署避坑指南:解决组件冲突,实现稳定运行 1. 项目概述与核心优势 ChatGLM3-6B-32k是智谱AI团队推出的新一代开源对话模型,基于本地化部署方案,特别针对组件冲突问题进行了深度优化。相比传统云端方案,本方…...
Qwen3-0.6B-FP8效果对比:与Phi-3-mini、Gemma-2B在低资源设备上的实测PK
Qwen3-0.6B-FP8效果对比:与Phi-3-mini、Gemma-2B在低资源设备上的实测PK 想在小显存的电脑上跑个大模型,体验一下AI对话的乐趣,是不是总被“显存不足”的提示劝退?别急,今天我们就来一场专为“小显存”设备准备的AI模…...
OpenClaw我的龙虾怎么识别不了图片
问题现象 图片发送给龙虾,要么一直说没收到图片,要么提示不支持,要么提示安装OCR工具,要么就是识别出来的完全牛头不对马嘴。 解决方案 这里面涉及三个因素: 模型是否支撑图片识别配置中的input是否配置了image聊天渠道…...
3步颠覆传统下载体验:百度网盘直链解析工具让你告别会员枷锁
3步颠覆传统下载体验:百度网盘直链解析工具让你告别会员枷锁 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 从200KB/s到5MB/s的蜕变 你是否也曾遇到这样的困境&a…...

