当前位置: 首页 > 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.lqws.cn/news/536743.html

相关文章:

  • 使用docker搭建redis主从架构,一主2从
  • day48-硬件学习之GPT定时器、UART及I2C
  • 日语学习-日语知识点小记-进阶-JLPT-真题训练-N2阶段(4):2022年12月2023年12月
  • 机器学习18-强化学习RLHF
  • python基于协同过滤的动漫推荐系统
  • 华为云Flexus+DeepSeek征文|一键部署知识库搜索增强版搭建AI Agent
  • 《仿盒马》app开发技术分享-- 逻辑优化第三弹(83)
  • 新手向:Neo4j的安装与使用
  • 供应链数据可视化大屏
  • OneCode框架 Tree 相关注解使用说明
  • 服务器的安装与安全设置 域环境的搭建和管理 Windows基本配置 网络服务常用网络命令的应用 安全管理Windows Server 2019
  • 独立开发还能做吗
  • Git-git worktree的使用
  • 测试方法的分类
  • recipes的版本比较老如何更新到新版本?
  • 板凳-------Mysql cookbook学习 (十--11)
  • AAAI 2025论文分享│面向生物医学的具有像素级洞察力的多模态大语言模型
  • day43 打卡
  • Redis主从架构哨兵模式
  • Rk3568驱动开发_Key驱动_13
  • Flink部署与应用——Flink架构概览
  • 如何在 Manjaro Linux 上启用 AUR 仓库来安装软件包
  • 关于如何在 Git 中切换到之前创建的分支的方法
  • 机器学习17-发展历史补充
  • 云财乐企新华网专访:以数字引擎驱动财税普惠化变革,赋能企业高质量发展
  • 可视化大屏展示
  • ubuntu部署woodpecker依赖gitea
  • 2-深度学习挖短线股-1-股票范围选择
  • Linux 高效网络调试命令
  • 同步互斥与通信-有缺陷的同步示例FreeRTOS笔记