当前位置: 首页 > 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的用法。欢迎各位读者留言方式提出宝贵意见,谢谢!

相关文章:

  • YOLOv10tensorRT推理代码C++
  • Apipost和Postman对比
  • Git-git worktree的使用
  • [OS_27] 现代应用程序架构 | Full System Emulation | VM | Docker
  • springcloud 尚硅谷 看到9开头
  • C++(模板与容器)
  • 【学习笔记】Dify知识库配置参数解析
  • 跨越十年的C++演进:C++14新特性全解析
  • CNN不是一个模型?
  • [特殊字符] Windows 查看端口占用及服务来源教程(以 9018 端口为例)
  • Python网安-随机密码生成器
  • 架构轻巧的kokoro 文本转语音模型
  • tcpdump用法
  • 快速傅里叶变换(FFT)是什么?
  • 以太网基础与 VLAN 配置实验
  • HTML 按钮单击事件示例
  • OceanBase批量插入数据报错java.lang.ArrayIndexOutOfBoundsException:0
  • 华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)
  • EMQ X Broker 配置HTTP 的外部鉴权接口
  • 力扣-合并区间