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

CC++的内存管理

目录

1、C/C++内存划分

C语言的动态内存管理

malloc

calloc

realloc

free

C++的动态内存管理

new和delete

operator new函数和operator delete函数

new和delete的原理

new T[N]原理

delete[]的原理


1、C/C++内存划分

1、栈:存有非静态局部变量、函数参数、返回值等。

2、内存映射段:用于装载共享的动态内存库,用户可使用系统接口创建共享内存,做进程间通信。

3、堆:用于程序运行时动态内存的分配。

4、数据段:存有全局数据和静态数据。

5、代码段:存有可执行代码、只读变量。


2、C语言的动态内存管理

C语言使用malloc、calloc、relloc、free等函数管理动态内存。

malloc

void* malloc (size_t size);

功能:向堆申请一块size字节连续可用的空间,并返回指针,

开辟成功返回指向已开辟好的空间的指针

开辟失败则返回空指针

calloc

void* calloc (size_t num, size_t size);

功能:为num个大小为size字节的元素向堆申请开辟一块空间,并且把空间的每个字节都初始化为0。

与malloc区别在于,malloc不会初始化。

realloc

void* realloc (void* ptr, size_t size);

功能:重新分配内存块,该内存块后面有足够的空间就进行原地扩容,不够就异地扩容(在堆上找另一块空间合适的连续空间使用,先将原来内存的数据拷贝到这个内存块中,在释放原来的空间)

free

void free (void* ptr);

功能:释放分配的空间。如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。如果参数ptr是NULL指针,则函数什么事都不做。

3、C++的动态内存管理

new和delete

C++兼容C语言。C语言内存管理方式虽然在C++中可以继续使用,但在有些地方并不够完善,而且使用起来比较麻烦。

因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。

new对应delete,new[]对应delete[],必须两两匹配,不匹配的话就是未定义行为。


operator new函数和operator delete函数

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

operator new函数功能:

1、调用malloc去分配空间,申请成功就直接返回

2、申请空间失败,就会抛出异常

operator delete函数功能:

operator delete 最终是通过free来释放空间的。

扩展(不重要):

operator new源码

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void* p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}

operator delete源码

#define free(p) _free_dbg(p, _NORMAL_BLOCK)
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);__TRYpHead = pHdr(pUserData);_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLYreturn;
}

new和delete的原理

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:

new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申

请空间失败时会抛异常,malloc会返回NULL。

new的原理

new等价于operate new()+构造函数先申请空间,后在申请的空间上调用构造,operate new()并不是new的重载,因为其参数没有自定义类型

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
申请空间失败,尝试执行空间不足应对措施,如果改应对措施用户设置了,则继续申请,否则抛异常。
*/
void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{void* p;while ((p = malloc(size)) == 0)if (_callnewh(size) == 0){// 如果申请内存失败了,这里会抛出bad_alloc 类型异常static const std::bad_alloc nomem;_RAISE(nomem);}return (p);
}

由底层代码可以看出operator new是对malloc的封装。

delete原理

delete等价于operator delete()+析构函数先调用析构,再用operator delete释放对象空间

#define free(p) _free_dbg(p, _NORMAL_BLOCK)
void operator delete(void *pUserData)
{_CrtMemBlockHeader * pHead;RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));if (pUserData == NULL)return;_mlock(_HEAP_LOCK);__TRYpHead = pHdr(pUserData);_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));_free_dbg( pUserData, pHead->nBlockUse );__FINALLY_munlock(_HEAP_LOCK);__END_TRY_FINALLYreturn;
}

由底层代码可以看出operator delete()调用了free。

针对有资源要释放的对象时,必须使用delete,free只是释放了对象的空间却没有释放对象内部的空间。


new T[N]原理

1、先调用operator new[]函数,operator new[]中实际调用operator new函数完成N个对象空间的申请。

2、再调用N次构造函数完成N个对象的初始化。

delete[]的原理

1、先调用N次析构函数,完成N个对象中资源的清理

2、再调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

相关文章:

CC++的内存管理

目录 1、C/C内存划分 C语言的动态内存管理 malloc calloc realloc free C的动态内存管理 new和delete operator new函数和operator delete函数 new和delete的原理 new T[N]原理 delete[]的原理 1、C/C内存划分 1、栈:存有非静态局部变量、函数参数、返回…...

Spark核心之02:RDD、算子分类、常用算子

spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD(Resilient Distributed Dataset)叫做**弹性分布式数据集,是Spark中最基本的数据抽象&#xff0c…...

【Resis实战分析】Redis问题导致页面timeout知识点分析

事故现象:前端页面返回timeout 事故回溯总结一句话: (1)因为大KEY调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用100%。   (2&#x…...

单一职责原则(设计模式)

目录 问题: 定义: 解决: 方式 1:使用策略模式 示例:用户管理 方式 2:使用装饰者模式 示例:用户操作 方式 3:使用责任链模式 示例:用户操作链 总结 推荐 问题&a…...

生理信号概念

rPPG 信号(远程光电容积脉搏波信号) 原理: 基于光电容积脉搏波描记法,利用普通摄像头,在一定距离外捕捉人体皮肤表面因心脏泵血导致的血液容积变化引起的细微颜色变化,通过图像处理和信号分析算法提取心率…...

安卓内存泄露之DMA-BUF异常增长:Android Studio镜像引起DMA内存泄露

安卓内存泄露之DMA-BUF异常增长:Android Studio镜像引起DMA内存泄露 - Wesley’s Blog 今天用着安卓 14 的板子的时候突然系统卡死。 查看日志发现launcher都被干掉了 03-04 06:13:35.544 7872 8479 I ActivityManager: vis BFGS 18740: com.android.launcher3 (pid 8407) se…...

android13打基础: 控件checkbox

测试checkbox的activity // todo: 高级控件checkbox public class Ch4_CheckBoxActivity extends AppCompatActivityimplements CompoundButton.OnCheckedChangeListener {Overrideprotected void onCreate(Nullable Bundle savedInstanceState) {super.onCreate(savedInstance…...

AI应用测试:遇到类ChatGPT的流式接口要如何压测?

先说结论: 使用最普遍的JMeter 就能支持类 OpenAI 的流式接口(如 ChatGPT 的流式聊天接口)的测试 总体设置 JMeter 支持测试 OpenAI 的流式接口,但需要额外配置(如启用 KeepAlive 和调整超时)。如果需要实时处理流式响应,使用 Regular Expression Extractor 或自定义脚…...

React面试葵花宝典之二

36.Fiber的更新机制 React Fiber 更新机制详解 React Fiber 是 React 16 引入的核心架构重构,旨在解决可中断渲染和优先级调度问题,提升复杂应用的流畅性。其核心思想是将渲染过程拆分为可控制的工作单元,实现更细粒度的任务管理。以下是其…...

在日常生活、工作中deepseek能帮我们解决哪些问题

在日常生活、工作中deepseek能帮我们解决哪些问题 DeepSeek极大降低了普通人使用AI的门槛,让AI快速渗透到人们的工作和生活中,无论是专业场景提效、教育学术赋能、商业创新甚至日常生活,都变得更加轻松。 当然这篇文章也参考了deepseek的回…...

【Java】IO流

Java IO流是Java中处理输入输出的核心机制,通过不同的流类型实现了对数据的高效读写。 一、IO流的分类 1. 按数据方向 输入流(Input Stream):从数据源(如文件、网络等)读取数据。输出流(Outp…...

HTML第三节

一.初识CSS 1.CSS定义 A.内部样式表 B.外部样式表 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…...

Visual Studio 2022安装问题解决,提示无法安装Microsoft.VisualStudio.Community.Msi

表现现象为&#xff1a;安装完后提示无法安装Microsoft.VisualStudio.Community.Msi&#xff0c;无法正常开发C项目 查看日志&#xff0c;大概显示&#xff1a; xxx ReturnCode1316 xxxxx 消息详细信息: 指定的帐户已存在。 试了网上所有的办法都没用&#xff0c;反复尝试&…...

【代码分享】基于IRM和RRT*的无人机路径规划方法详解与Matlab实现

基于IRM和RRT*的无人机路径规划方法详解与Matlab实现 1. IRM与RRT*的概述及优势 IRM&#xff08;Influence Region Map&#xff09;通过建模障碍物的影响区域&#xff0c;量化环境中的安全风险&#xff0c;为RRT算法提供启发式引导。RRT&#xff08;Rapidly-exploring Random…...

MybatisPlus从入门到精通

一、MyBatis-Plus核心特性 无侵入性 在MyBatis基础上增强&#xff0c;无需修改原有代码即可使用。自动化CRUD 内置通用Mapper和Service&#xff0c;减少80%单表操作代码。Lambda表达式 支持Lambda形式的条件构造&#xff0c;避免字段名硬编码错误。主键策略 支持雪花算法&…...

el-table input textarea 文本域 自适应高度,切换分页滚动失效处理办法

场景&#xff1a; el-table 表格 需要 input类型是 textarea 高度是自适应&#xff0c;第一页数据都是单行数据 不会产生滚动条&#xff0c;但是第二页数据是多行数据 会产生滚动条&#xff0c; bug: 第一页切换到第二页 第二页滚动条无法展示 解决办法&#xff1a;直接修改样…...

基于Windows11的DockerDesktop安装和布署方法简介

基于Windows11的DockerDesktop安装和布署方法简介 一、下载安装Docker docker 下载地址 https://www.docker.com/ Download Docker Desktop 选择Download for Winodws AMD64下载Docker Desktop Installer.exe 双点击 Docker Desktop Installer.exe 进行安装 测试Docker安装是…...

ffmpeg源码编译支持cuda

1.安装cuda CUDA Toolkit 11.3 Downloads | NVIDIA Developer 在选择组件的时候&#xff0c;将CUDA中的Nsight VSE和Visual Studio Integration取消勾选 不然会安装失败 2.编译ffmpeg 把cuda编译宏定义开启&#xff0c;再编译avcodec 3.编译livavutil报错struct "Cuda…...

动漫短剧开发公司,短剧小程序搭建快速上线

在当今快节奏的生活里&#xff0c;人们的娱乐方式愈发多元&#xff0c;而动漫短剧作为新兴娱乐形式&#xff0c;正以独特魅力迅速崛起&#xff0c;成为娱乐市场的耀眼新星。近年来&#xff0c;动漫短剧市场呈爆发式增长&#xff0c;吸引众多创作者与观众目光。 从市场规模来看…...

《2025软件测试工程师面试》接口测试篇

基础概念 什么是接口测试? 接口测试是测试系统组件间接口的一种测试,主要用于检测外部系统和内部系统之间以及各个子系统之间的交互点。测试的重点是检查数据的交换、传递和控制管理的过程,以及系统间的相互逻辑依赖关系等。 接口测试的优势是什么? 接口测试具有规范性与扩…...

智能水塔改造指南:用S7-200PLC+超声波传感器实现低成本自动化

智能水塔改造实战&#xff1a;S7-200PLC与超声波传感器的低成本自动化方案 在农村和小型工厂的实际运营中&#xff0c;水塔作为重要的供水设施&#xff0c;其稳定性和自动化程度直接影响着日常生产和生活。传统的人工监控方式不仅效率低下&#xff0c;还存在水位失控的风险。本…...

ESP32Cam与YOLOv3构建边缘图像识别系统

1. 项目概述&#xff1a;ESP32CamYOLOv3图像识别系统这个项目构建了一个完整的嵌入式图像识别系统&#xff0c;核心由ESP32Cam模块和YOLOv3算法组成。作为一名长期从事嵌入式视觉开发的工程师&#xff0c;我认为这种组合是目前性价比最高的边缘计算视觉方案之一。ESP32Cam模块集…...

探索kedro:数据科学项目的高效管理框架

探索kedro&#xff1a;数据科学项目的高效管理框架 【免费下载链接】kedro Kedro is a toolbox for production-ready data science. It uses software engineering best practices to help you create data engineering and data science pipelines that are reproducible, ma…...

Swin2SR权限控制系统搭建:从小白到部署的完整实战教程

Swin2SR权限控制系统搭建&#xff1a;从小白到部署的完整实战教程 1. 引言&#xff1a;从个人工具到团队服务的转变 你刚刚体验了Swin2SR的强大&#xff0c;一张模糊的老照片&#xff0c;几秒钟就变得清晰锐利&#xff0c;那种感觉就像给图片做了一次“数字近视手术”。但很快…...

Qwen1.5-1.8B GPTQ开发环境配置:IntelliJ IDEA插件开发初探

Qwen1.5-1.8B GPTQ开发环境配置&#xff1a;IntelliJ IDEA插件开发初探 如果你是一名Java开发者&#xff0c;对AI大模型感兴趣&#xff0c;想在自己的IDE里搞点“智能”新花样&#xff0c;那么你来对地方了。今天我们不聊复杂的模型训练&#xff0c;也不讲高深的算法原理&…...

别再纠结选哪个了!CAN、串口、蓝牙、TCP,手把手教你根据项目场景选通信协议(附Android实战代码)

通信协议选型实战指南&#xff1a;从车载系统到智能家居的黄金法则 当你在凌晨三点的办公室里盯着四块显示器&#xff0c;面前摆着CAN分析仪、蓝牙嗅探器和串口调试终端时&#xff0c;突然意识到项目deadline就在明天——这种场景对嵌入式开发者来说再熟悉不过了。选择错误的通…...

如何通过Windows Cleaner实现C盘空间释放:提升系统性能的完整指南

如何通过Windows Cleaner实现C盘空间释放&#xff1a;提升系统性能的完整指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到C盘爆红的困扰&#…...

3大核心功能揭秘:CELLxGENE如何让单细胞数据分析变得如此简单

3大核心功能揭秘&#xff1a;CELLxGENE如何让单细胞数据分析变得如此简单 【免费下载链接】cellxgene An interactive explorer for single-cell transcriptomics data 项目地址: https://gitcode.com/gh_mirrors/ce/cellxgene 在单细胞转录组学研究中&#xff0c;数据分…...

LaTeX算法排版避坑指南:从Undefined control sequence到完美排版

LaTeX算法排版避坑指南&#xff1a;从Undefined control sequence到完美排版 第一次在LaTeX里插入算法伪代码时&#xff0c;那个刺眼的红色"Undefined control sequence"错误让我盯着屏幕发呆了半小时。作为科研工作者&#xff0c;我们总希望论文中的算法描述能和数学…...

告别环境混乱:Python3.9镜像实战教程,独立环境管理如此简单

告别环境混乱&#xff1a;Python3.9镜像实战教程&#xff0c;独立环境管理如此简单 1. 为什么需要Python3.9镜像 在Python开发中&#xff0c;最令人头疼的问题莫过于环境冲突。想象一下这样的场景&#xff1a;你正在开发一个需要TensorFlow 2.4的项目&#xff0c;但同时还要维…...