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

C++智能指针概念及std::unique_ptr使用介绍

(一)引言

       C++软件开发过程中,内存管理需要开发者自行处理,总得原则是谁new的内存谁负责delete释放,程序规模非常小开发人员少的情况下不容易出问题,当系统代码规模庞大、团队人员众多时,内存管理就非常重要,一旦出现内存泄漏或野指针的情况,系统开发、测试、交付都会面临很大的问题。这也是好多Java爱好者对C++语言诟病的原因,不过既然选择C++语言,看重了它的优点就要管好内存,这也是合格C++软件工程师的基本要求。

       今天不评论C++语言的new和Delete管理内存、软件工程师开发水平高低的问题,而是介绍下C++11及以上标准引入的智能指针,介绍智能指针的常用方法,并通过源代码示例让读者更好地理解、掌握、使用C++语言的新特性。个人理解,即便在C++软件开发中使用了智能指针,当对象不需要时就要主动释放销毁,而不能一直占用内存资源,最终还会导致内存资源的耗尽。

(二)概述

‌        智能指针(Smart Pointer)‌是C++11中引入的一种新标准特性,用于自动管理动态分配的内存,避免资源泄漏和悬挂指针问题。智能指针通过封装原始指针,并在对象的生命周期结束时自动调用析构函数释放内存,从而简化了内存资源管理,提高了C++软件源代码的安全性和可维护性。

       该机制利用了C++的RAII(Resource Acquisition Is Initialization)原则,确保资源在对象的作用域内始终有效。智能指针基于‌引用计数,当智能指针指向一个动态分配的对象时,该对象的引用计数会增加。当该智能指针被销毁或被赋予新的值时,引用计数会减少。当引用计数达到0时,对象会被自动删除。

       C++ 标准库中定义了三种主要的智能指针类型:std::unique_ptr、std::shared_ptr和std::weak_ptr,它们各自适用于不同的场景,接下来我们将逐一进行介绍。早期的智能指针auto_ptr已不再使用,本文不再介绍。

(三)std::unique_ptr智能指针用法

       std::unique_ptr是一种独占式智能指针,它拥有对所管理对象的唯一所有权,同一时间,只能有一个std::unique_ptr指向某对象,不允许进行复制操作,但可以通过std::move函数转移所有权。

1、创建和使用std::unique_ptr指针

       在上述代码中,std::make_unique<int>(88)创建了一个动态分配的int对象,并将其所有权赋予pIntData1。当pIntData1离开作用域时,它会自动调用delete释放所管理的内存,无需开发者手动操作。源代码示例如下:

       注意:使用智能指针必须包含头文件“#include <memory>”。

#include <iostream>
#include <memory>//创建独占所有权的智能指针
void Test_func_unique_ptr_new(void)
{//创建一个管理Int数据的独占式指针std::unique_ptr<int> pIntData1 = std::make_unique<int>(88);
}

2、所有权转移新的std::unique_ptr指针

       通过std::move函数,pIntData1的所有权被转移到了pIntData2pIntData1变为空指针状态,不能再用于访问所管理的对象。源代码示例如下:

#include <iostream>
#include <memory>//转移独占所有权的智能指针
void Test_func_unique_ptr_mov(void)
{//创建一个管理Int数据的独占式指针std::unique_ptr<int> pIntData1 = std::make_unique<int>(88);//将pIntData1对象的所有权转移至pIntData2std::unique_ptr<int> pIntData2 = std::move(pIntData1);
}

3、使用智能指针管理类对象

       下面示例定义了学生类,并且创建并转移学生类的智能指针pStudent2,并调用成员函数输出学生的基本信息,当pStudent2离开作用域时,CStudent学生对象的析构函数会自动被调用,完成pStudent2资源清理工作。

(1)程序执行结果

(2)程序源代码

#include <iostream>
#include <memory>//学生类
class CStudent
{
public:CStudent(const std::string& name, int age): m_name(name), m_age(age){}~CStudent(void){}void Print_Info(void){std::cout << "My Basicinfo name: " << m_name << " and age: " << m_age << std::endl;}private:std::string     m_name;int             m_age;
};void Test_func_unique_ptr_cls(void)
{//创建一个管理Int数据的独占式指针std::unique_ptr<CStudent> pStudent1 = std::make_unique<CStudent>(std::string("TOM"), 17);//将pStudent1对象的所有权转移至pStudent2std::unique_ptr<CStudent> pStudent2 = std::move(pStudent1);pStudent2->Print_Info();
}

(四)结语

       本文简要介绍了C++11标准引入的智能指针的概念、机制以及分类,并重点介绍了其中一种所有权独占智能指针(std::unique_ptr)的用法和源代码示例,今天先到这里,后面文章再逐一介绍std::shared_ptr和std::weak_ptr的用法。欢迎各位读者留言方式提出宝贵意见,谢谢!

http://www.lryc.cn/news/575788.html

相关文章:

  • 【办公类-105-01】20250626 托小班报名表-条件格式-判断双胞胎EXCLE
  • CNN不是一个模型?
  • 跨越十年的C++演进:C++14新特性全解析
  • C++(模板与容器)
  • Java--程序控制结构(下)
  • springcloud 尚硅谷 看到9开头
  • NebulaGraph 图数据库介绍
  • 一分钟了解Transformer
  • 缓存与加速技术实践-MongoDB数据库应用
  • AI+时代已至|AI人才到底该如何培育?
  • Python打卡:Day37
  • 快速傅里叶变换(FFT)是什么?
  • 4.2_1朴素模式匹配算法
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)
  • LeetCode 2302.统计得分小于K的子数组数目
  • 力扣第45题-跳跃游戏2
  • [mcp-servers] docs | AI客户端-MCP服务器-AI 架构
  • linux cp与mv那个更可靠
  • 浅析阿拉伯语OCR技术的核心难点及其应用场景
  • LeetCode 2311.小于等于 K 的最长二进制子序列:贪心(先选0再选1)-好像还是比灵神写的清晰些
  • 996引擎-假人系统
  • VUE3入门很简单(3)--- watch
  • 重塑音视频叙事:Premiere文本剪辑与Podcast AI降噪的革命性工作流
  • 解决 “docker-compose: command not found“ 错误
  • C2远控篇CC++SC转换格式UUID标识MAC物理IPV4地址减少熵值
  • Selenium+Pytest自动化测试框架实战
  • 玄机抽奖Spring Web项目
  • MySQL5.7和8.0 破解root密码
  • 【软件测试】银行信贷项目-面试题常问整理
  • Python 中 `for` 循环与 `while` 循环的实际应用区别:实例解析