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

【C++】--内存管理

👾个人主页: 起名字真南
👻个人专栏:【数据结构初阶】 【C语言】 【C++】

请添加图片描述

目录

  • 1 C/C++内存分布
  • 2 C语言中动态内存管理方式 :
  • 3 C++内存管理方式
    • 3.1 new/delete操作内置类型
    • 3.2 new和delete操作自定义类型
  • 4 operator new与operator delete
    • 4.1 operator new与operator delete函数
  • 5 new和delete的实现原理
    • 5.1 内置类型
    • 5.2 自定义类型
  • 6 malloc/free和new/delete的区别

1 C/C++内存分布

在这里插入图片描述
在C/C++程序中,内存通常分为以下几个区域 :

1 代码段:

  • 用于存放程序的机器指令,即编译后的代码。代码段是只读的,防止程序在运行时修改自身指令。

2 数据段 :

  • 包含已经初始化的全局变量和静态变量,这些变量在程序运行期间一直存在
  • 分为两个区一个是.data区域用于存放已经初始化的全局变量和静态变量,另一个是.bss区域,用于存放未初始化的全局变量和静态变量并将它们初始化为0.

3 堆区:

  • 用于动态内存分配,程序运行时可以通过malloc、calloc、new来分配内存,使用free、delete来释放内存
  • 堆的内存管理有程序员手动执行,管理不当容易造成内存泄漏。

4 栈区 :

  • 用于存放函数调用时的临时数据,局部变量,返回地址和函数参数等

  • 栈的内存都是自动分配和释放的,随着函数的进入和退出,局部变量会自动分配释放。
    5 内存映射段 :

  • 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库,用户可使用系统接口创建共享内存,做进程间通信。

2 C语言中动态内存管理方式 :

void Test02()
{int* p1 = (int*)malloc(sizeof(int) * 2);int* p2 = (int*)realloc(p1, 4);int* p3 = (int*)calloc(4, sizeof(int));
}

3 C++内存管理方式

3.1 new/delete操作内置类型

void Test03()
{//动态申请一个int类型的空间int* p1 = new int;//动态申请一个int类型的空间,初始化为10int* p2 = new int(10);//动态申请10个int类型的空间int* p3 = new int[10];delete p1;delete p2;delete[] p3;
}

申请和释放一块空间使用new和delete,申请和释放一段连续的空间就需要使用new[]和delete[]搭配使用

3.2 new和delete操作自定义类型

int main()
{//new/delete 和 malloc/free的最大的区别就是new/delete会自动调用自定义类型的构造函数和析构函数A* p1 = (A*)malloc(sizeof(A));A* p2 = new A(1);free(p1);p1 = nullptr;delete p2;return 0;
}

运行结果 :
在这里插入图片描述
我们可以看到new和delete自动调用了A类型的构造函数和析构函数。

4 operator new与operator delete

4.1 operator new与operator delete函数

new和delete是用户进行动态申请的操作符,operator new与operator delete是系统提供的全局函数,new在底层通过调用operator new来动态分配空间,delete在底层通过调用operator delete来动态分配空间,

/*operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc){// try to allocate size bytesvoid *p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// report no memory// 如果申请内存失败了,这里会抛出bad_alloc 类型异常
static const std::bad_alloc nomem;_RAISE(nomem);}return (p);}/*operator delete: 该函数最终是通过free来释放空间的
*/void operator delete(void *pUserData){_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);  /* block other threads */__TRY/* get a pointer to memory block header */pHead = pHdr(pUserData);/* verify block type */_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK);  /* release other threads */__END_TRY_FINALLYreturn;}/*free的实现
*/#define   	free(p)     _free_dbg(p, _NORMAL_BLOCK)

5 new和delete的实现原理

5.1 内置类型

如果申请的空间是一个空间那么new和delete以及malloc和free基本上没有区别,不同的地方是new/delete分配和释放的是单个元素的空间,而new[]和delete[]分配和释放的是一段连续的空间,如果new的时候失败了会抛异常,malloc失败了会返回NULL。

5.2 自定义类型

  1. new的原理

    1 调用operator new函数申请空间
    2 在申请的空间上调用构造函数,完成对象的构造

  2. delete的原理
    1 在空间上执行析构函数,完成对象中的资源清理工作
    2 调用operator delete 函数释放对象的空间

  3. new[]的原理
    1 调用operator new[]函数,在operator new[]函数中调用N次operator new函数来完成对象空间的申请。
    2 在申请的空间上调用N次构造函数

  4. delete[]的原理
    1 在空间上执行N次析构函数,完成N个对象中的资源清理工作
    2 调用operator delete[]函数释放空间,实际在operator delete[]中调用N次operator delete函数来释放空间

6 malloc/free和new/delete的区别

他们的共同点:都要在堆上开辟空间,并且都需要用户手动释放
不同点 :

  1. malloc/free是函数,new/delete是操作符
  2. malloc开辟的空间不会初始化,new可以初始化
  3. malloc申请空间需要手动计算开辟空间的大小,而new只需要在后面加上函数的类型并且在[]中添加需要开辟的数量
  4. malloc开辟空间的返回值类型是void*使用时需要强转,而new后跟的是空间类型
  5. malloc申请失败会判空,而new失败会抛异常
  6. 申请自定义类型是只有new/delete会调用函数的构造函数和析构函数

相关文章:

【C++】--内存管理

👾个人主页: 起名字真南 👻个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 C/C内存分布2 C语言中动态内存管理方式 :3 C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4 operator new与operator delete4.1 opera…...

【设计模式系列】模板方法模式

一、什么是模板方法模式 模板方法模式(Template Method Pattern)是一种行为型设计模式,它在父类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的某些特定步骤。这种模式非常适合于那些存在共同行为的类&#x…...

java8 Stream流详细API及用法

目录 整理的更全面的API及用法 创建Stream流 中间操作 filter 过滤 map 映射 flatMap 扁平映射 sorted 排序 limit 截断 skip 跳过 distinct 去重 peek 遍历 终端操作 forEach 遍历 forEachOrdered 顺序遍历 min 统计最小值 max 统计最大值 count 统计元素数量 f…...

Redis——持久化

文章目录 Redis持久化Redis的两种持久化的策略定期备份:RDB触发机制rdb的触发时机:手动执行save&bgsave保存测试不手动执行bgsave测试bgsave操作流程测试通过配置,自动生成rdb快照RDB的优缺点 实时备份:AOFAOF是否会影响到red…...

川字结构布局/国字结构布局

1.串字结构布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style&g…...

2013年国赛高教杯数学建模C题古塔的变形解题全过程文档及程序

2013年国赛高教杯数学建模 C题 古塔的变形 由于长时间承受自重、气温、风力等各种作用&#xff0c;偶然还要受地震、飓风的影响&#xff0c;古塔会产生各种变形&#xff0c;诸如倾斜、弯曲、扭曲等。为保护古塔&#xff0c;文物部门需适时对古塔进行观测&#xff0c;了解各种变…...

web 0基础第一节 文本标签

这是一个html文件的基本结构 在vs code 中使用英文的 ! 可快捷设置这样的结构 <!-- --> 是在html写注释的结构 <!DOCTYPE html> <!--标识当前文档类型为html--> <html> …...

Zookeeper快速入门:部署服务、基本概念与操作

文章目录 一、部署服务1.下载与安装2.查看并修改配置文件3.启动 二、基本概念与操作1.节点类型特性总结使用场景示例查看节点查看节点数据 2.文件系统层次结构3.watcher 一、部署服务 1.下载与安装 下载&#xff1a; 一定要下载编译后的文件&#xff0c;后缀为bin.tar.gz w…...

【Sqlite】sqlite内部函数sqlite3_value_text特性

目录 ⚛️1 结论 ☪️2 说明 ☪️3 传入数值转成科学计数法 ♋3.1 只有整数部分 ♏3.2 只有小数部分 ♐3.3 整数小数 ⚛️1 结论 整数(sqlite视为int64)位数 > 20位&#xff0c;sqlite3_value_text 采用科学计数法。否则正常表示。 浮点数(sqlite视为double)的整数部…...

树莓派应用--AI项目实战篇来啦-4.OpenCV读取、写入和显示视频

1. 介绍 视频是由一张一张图片组成的&#xff0c;所以读取视频就相当于读取很多张图片&#xff0c;然后将其连起来cv2.VideoCapture可以捕获摄像头&#xff0c;但是针对树莓派的CSI摄像头调用方式采用了之前介绍的Picamera2 库&#xff0c;所以在调用的时候是有区别的&#xff…...

智能电子后视镜,汽车驾驶更安全,会是一种趋势

相比于传统的后视镜&#xff0c;智能电子后视镜的确有很多的优点。在下雨天和夜晚场景&#xff0c;电子后视镜可以说是表现优秀。 我之前一直以为我们国内是有规定不能使用电子后视镜。没想到&#xff0c;偶然刷到享界S9的视频&#xff0c;这电子后视镜&#xff0c;妥妥的给安排…...

IEC104规约的秘密之九----链路层和应用层

104规约从TCP往上&#xff0c;分成链路层和应用层。 如图&#xff0c;APCI就是链路层&#xff0c;ASDU的就是应用层 我们看到报文都是68打头的&#xff0c;因为应用层报文也要交给链路层发送&#xff0c;链路层增加了开头的6个字节再进行发送。 完全用于链路层的报文每帧都只有…...

最新Prompt预设词指令教程大全ChatGPT、AI智能体(300+预设词应用)

使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可以前往已经添加好Prompt预设的AI系统测试使用&#xff08;可自定义添加使用&#xff09; SparkAi系统现已支持自定义添加官方GPTs&#xff08;对专业领域更加专业&#xff0c;支持多模态文档&#xff0…...

DockerCompose 启动 open-match

背景介绍 open-match是Google和unity联合开源的支持实时多人匹配的框架&#xff0c;已有多家游戏厂商在生产环境使用&#xff0c;官网 https://open-match.dev/site/ 。原本我们使用的是UOS上提供的匹配能力&#xff0c;但是UOS目前不支持自建的Dedicated servers 集群&#x…...

Chainlit集成Dashscope实现语音交互网页对话AI应用

前言 本篇文章讲解和实战&#xff0c;如何使用Chainlit集成Dashscope实现语音交互网页对话AI应用。实现方案是对接阿里云提供的语音识别SenseVoice大模型接口和语音合成CosyVoice大模型接口使用。针对SenseVoice大模型和CosyVoice大模型&#xff0c;阿里巴巴在github提供的有开…...

Canal 扩展篇(阿里开源用于数据同步备份,监控表和表字段(日志))

1.Canal介绍 Canal把自己伪装成从数据库&#xff0c;获取mysql主数据库的日志&#xff08;binlog&#xff09;信息&#xff0c;所以要想使用canal就得先开启数据库日志 https://github.com/alibaba/canal Canal 主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量…...

顺序表的定义

一.顺序表的定义 顺序表--用顺序存储的方式实现线性表 顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中&#xff0c;元素之间的关 系由存储单元的邻接关系来体现。 二.顺序表的实现--静态分配 #include<stdio.h> #define MaxSize 10 //定义最大长度 …...

青少年编程能力等级测评CPA C++一级试卷(1)

青少年编程能力等级测评CPA C一级试卷&#xff08;1&#xff09; 一、单项选择题&#xff08;共20题&#xff0c;每题3.5分&#xff0c;共70分&#xff09; CP1_1_1&#xff0e;在C中&#xff0c;下列变量名正确的是&#xff08; &#xff09;。 A&#xff0e;$123 B&#…...

R语言中的plumber介绍

R语言中的plumber介绍 基本用法常用 API 方法1. GET 方法2. POST 方法3. 带路径参数的 GET 方法 使用 R 对数据进行操作处理 JSON 输入和输出运行 API 的其他选项其他功能 plumber 是个强大的 R 包&#xff0c;用于将 R 代码转换为 Web API&#xff0c;通过使用 plumber&#x…...

uniapp 设置 tabbar 的 midButton 按钮

效果展示&#xff1a; 中间的国际化没生效&#xff08;忽略就行&#xff09; 示例代码&#xff1a; 然后在 App.vue 中进行监听&#xff1a; <script>export default {onLaunch(e) {// #ifdef APPuni.onTabBarMidButtonTap(()>{console.log("中间按钮点击回调…...

SLCAN协议实战:从脚本编写到自动化测试全解析

1. SLCAN协议基础&#xff1a;嵌入式开发者的文本化CAN接口 第一次接触SLCAN协议时&#xff0c;我正为一个汽车电子项目头疼——需要快速验证CAN总线设备却找不到合适的调试工具。直到发现抽屉里吃灰的LAWICEL CANUSB适配器&#xff0c;这个基于SLCAN协议的小玩意彻底改变了我…...

3个技巧让FanControl风扇识别率提升90%:Windows 11用户的实战指南

3个技巧让FanControl风扇识别率提升90%&#xff1a;Windows 11用户的实战指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_…...

使用Taotoken的Token Plan套餐实现更具成本优势的持续调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 使用Taotoken的Token Plan套餐实现更具成本优势的持续调用 对于有稳定大模型调用需求的开发者或团队而言&#xff0c;成本的可预测…...

揭秘开源智能字幕系统:如何用AI实现高效的多语言内容本地化

揭秘开源智能字幕系统&#xff1a;如何用AI实现高效的多语言内容本地化 【免费下载链接】openlrc Transcribe and translate voice into LRC file using Whisper and LLMs (GPT, Claude, et,al). 使用whisper和LLM(GPT&#xff0c;Claude等)来转录、翻译你的音频为字幕文件。 …...

汉森软件冲刺港股:年营收6亿 净利1.4亿 已获IPO备案

雷递网 雷建平 5月15日深圳市汉森软件股份有限公司&#xff08;简称&#xff1a;“汉森软件”&#xff09;日前更新招股书&#xff0c;准备在港交所上市。汉森软件已获IPO备案&#xff0c;拿到了上市的钥匙&#xff0c;同期一并拿到备案的企业还包括南京海纳医药科技股份有限公…...

MAA明日方舟自动辅助工具终极指南:一键解放双手的智能解决方案

MAA明日方舟自动辅助工具终极指南&#xff1a;一键解放双手的智能解决方案 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: htt…...

大疆C板实战:基于BMI088与Mahony算法的实时姿态解算实现

1. 从零开始搭建姿态解算系统 第一次接触大疆C板的时候&#xff0c;我被它精致的做工和丰富的接口惊艳到了。这块开发板简直就是为机器人开发者量身定做的&#xff0c;特别是内置的BMI088惯性测量单元(IMU)&#xff0c;让我们不用再为传感器选型和电路设计发愁。不过说实话&…...

终极指南:如何快速解决iPhone在Windows上的USB网络共享问题

终极指南&#xff1a;如何快速解决iPhone在Windows上的USB网络共享问题 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/g…...

UltimateStack:彻底解决Minecraft物品堆叠限制的终极指南

UltimateStack&#xff1a;彻底解决Minecraft物品堆叠限制的终极指南 【免费下载链接】UltimateStack A Minecraft mod,can modify ur item MaxStackSize (more then 64) 项目地址: https://gitcode.com/gh_mirrors/ul/UltimateStack 你是否曾经在Minecraft中为物品堆叠…...

开源项目文档自动化验证:gate-of-oss 守护 README 与代码一致性

1. 项目概述&#xff1a;一个开源项目的“守门人” 在开源的世界里&#xff0c;项目仓库的README文件就像是项目的“门面”和“说明书”。然而&#xff0c;随着项目迭代&#xff0c;依赖项更新、构建脚本变动、环境配置要求变化是家常便饭。你有没有遇到过这样的场景&#xff1…...