C/C++内存管理,malloc,realloc,calloc,new,delete详解!!!
1.初步了解内存中各个区间存储的数据特征

1.栈区:存储一些局部变量、函数参数、返回值等,跟函数栈振有关,出了作用域,生命周期结束。
2.堆区:用于动态开辟空间,如果不主动销毁空间,则程序运行结束,生命周期结束。
3.数据段(静态区):static修饰的静态变量和全局变量,程序运行结束,生命周期结束。
4.代码段(常量区):可执行的代码和常量。
练习
int globalVar = 1; static int staticGlobalVar = 1; void Test() { static int staticVar = 1; int localVar = 1; int num1[10] = { 1, 2, 3, 4 }; char char2[] = "abcd"; const char* pChar3 = "abcd"; int* ptr1 = (int*)malloc(sizeof(int) * 4); int* ptr2 = (int*)calloc(4, sizeof(int)); int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4); free(ptr1); free(ptr3); }选项 : A . 栈 B . 堆 C . 数据段 ( 静态区 ) D . 代码段 ( 常量区 )globalVar 在哪里? __1__ staticGlobalVar 在哪里? __2__staticVar 在哪里? __3__ localVar 在哪里? __4__num1 在哪里? __5__char2 在哪里? __6__ * char2 在哪里? __7_pChar3 在哪里? __8__ * pChar3 在哪里? __9__ptr1 在哪里? __10__ * ptr1 在哪里? __11__
1.C 2.C 3.C 4. A 5.A6.A 7. A 8.A 9.D 10.A 11.B
结合上图可以得知,cha2其本身存放在栈区,指针指向栈区中数组首元素的地址,再将静态区中"abcd"赋值给数组,所以*char指向的元素在栈区!!!pChar3其本身存放在栈区,指向静态区中存放"abcd"字符串的首地址!!!
2.c语言实现内存管理
2.1malloc

在堆上开一快符合你预期大小的一块空间,并且返回指向该地址空间的指针
void* malloc (size_t size);
size:开多大的空间,单位是字节
2.2realloc

如果malloc开辟出来的空间开少了,realloc可以在堆上重新开一块符合你预期大小的空间,并返回指向该空间的指针
void* realloc (void * ptr,size_t size);
ptr:初始空间的地址
size:将空间开辟到多大
2.3calloc

用于对开辟的空间进行初始化,calloc会将开辟的空间中每个元素初始化为0
void* realloc (size_t num,size_t size);
num:分配的元素数量
size:每个元素的大小
3.c++实现内存管理
3.1 new/delete new []/delete []
在c++中,有两对操作符new/delete、new []/delete [],他们的作用是负责开空间和释放空间!!!
new作用跟malloc类似,delete作用跟free类似
new和delete在面对自定义类型时会去调用构造函数和析构函数
new =先申请对象空间 再调用构造函数
delete = 先调用析构函数 再释放对象空间
3.1.1内置类型
当需要开一个整形的空间时。
int main()
{ //mallocint* p1 = (int*)malloc(sizeof(int));//new开空间用法跟malloc不同,但是作用相同,都是负责开空间!!!int* p2 = new int;//freefree(p1);//deletedelete(p2);return 0;
}
当需要开多个空间时 例如开10个int类型的空间 需要加上[]
int main()
{int* p1 = (int*)malloc(sizeof(int)*10);int* p2 = new int[10];free(p1);delete[](p2);return 0;
}
3.1.2自定义类型
new和delete在面对自定义类型时会去调用构造函数和析构函数
new =先开空间 再调用构造函数
delete = 先调用析构函数 再释放空间
class Stack
{
public:Stack(int capacity = 4){_a = new int[capacity];int _top = 0;int _capacity = capacity;}~Stack(){delete (_a);_a = nullptr;_top = 0;_capacity = 0;}
private:int* _a;int _top;int _capacity;
};
int main()
{Stack* p2 = new Stack;//new先开空间 再去调用构造函数delete(p2);//delete先调用析构函数,再去释放空间return 0;
}
如果需要开10个Stack类型的空间 用new[] 和 delete[]
int main()
{Stack* p2 = new Stack[10];//new先开空间 再去调用构造函数delete[](p2);//delete先调用析构函数,再去释放空间return 0;
}
3.2new/delete底层实现原理
3.2.1 全局函数 operator new/operator delete
要知道原理,我们就得先知道operatot new / operator delete 这两个全局函数
在c++中,有这样两个全局函数,他们的作用跟malloc、free类似,都是负责开空间和释放空间!!!
注意:operator new / operator delete 不是new/delete的重载,而是两个全局函数!!!
我们知道malloc申请空间失败的时候,会返回空。而operator new申请空间失败的时候则会抛异常。我们可以理解为operator是封装的malloc。
也就是说operator new 和mclloc除了申请空间失败的处理方法不同,其他的用法以及功能是相同的!!!
operator delete 可以理解为跟operator new对应,其用法和功能跟free完全一样!!!
int main()
{Stack* p1 = (Stack*)malloc(sizeof(Stack));free(p1);//operator new底层用的是mallocStack* p2 = (Stack*)operator new (sizeof(Stack));//operator delete底层用是freeoperator delete(p2);return 0;
}
3.2.2 new/delete 和 operator new/operator delete的关系
new = 1.申请对象空间 + 2.调用构造
delete = 1.调用析构 + 2.释放对象空间
在底层原理上,new的第一步申请对象空间底层就是调用operator new函数,
operator的第二步释放对象空间底层就是调用operator operator函数.
也就是说下面两段不同的代码,起到的作用都是相同的
int main()
{Stack* p1 = new Stack;delete (p1);//等价于newStack* p2 = (Stack*)operator new (sizeof(Stack));//定位new显示调用构造函数new(p2)Stack;//等价于deletep2->~Stack();operator delete(p2);return 0;
}
我们到汇编语言的角度证明一下

相关文章:
C/C++内存管理,malloc,realloc,calloc,new,delete详解!!!
1.初步了解内存中各个区间存储的数据特征 1.栈区:存储一些局部变量、函数参数、返回值等,跟函数栈振有关,出了作用域,生命周期结束。 2.堆区:用于动态开辟空间,如果不主动销毁空间,则程序运行结…...
高级JVM
一、Java内存模型 1. 我们开发人员编写的Java代码是怎么让电脑认识的 首先先了解电脑是二进制的系统,他只认识 01010101比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的HelloWord.java是我们程序员编写的,我们人可以认识,但是电脑不…...
论文阅读——MCAN(cvpr2019)
补充一下MCAN-VQA: 对图片的处理:首先输入图片到Faster R-CNN,会先设定一个判断是否检测到物体的阈值,这样动态的生成m∈[10,100]个目标,然后从检测到的对应的区域通过平均池化提取特征。第i个物体特征表示为ÿ…...
mac电脑文件比较工具 UltraCompare 中文for mac
UltraCompare是一款功能强大的文件和文件夹比较工具,用于比较和合并文本、二进制和文件夹。它提供了丰富的功能和直观的界面,使用户能够轻松地比较和同步文件内容,查找差异并进行合并操作。 以下是UltraCompare软件的一些主要特点和功能&…...
XML Schema 的extension 元素
XML Schema 的extension 元素对complexContent、simpleContent元素进行扩展。 例如,下面通过增加了两个属性,对simpleContent进行了扩展: <xs:element name"condition" maxOccurs"unbounded" minOccurs"0"…...
每日一题2023.11.26——打印沙漏【PTA】
题目要求: 本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印 ************ *****所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;…...
【C++】类和对象——拷贝构造和赋值运算符重载
上一篇我们讲了构造函数,就是对象实例化时会自动调用,那么,我们这里的拷贝构造在形式上是构造函数的一个重载,拷贝构造其实也是一种构造函数,那么我们就可以引出这里的规则 1.拷贝构造函数的函数名必须与类名相同。 2.…...
基于acme免费申请泛域名证书
参考文档:https://github.com/acmesh-official/acme.sh 文章目录 step1: 获取阿里云的ak、skstep2: 安装acmestep3: 安装通配符证书step4: 查看证书step5: 证书的使用step6: 删除证书 step1: 获取阿里云的ak、sk export Ali_Key"LTAI5tG8888888CDoEjLzkE"…...
系列十九、Spring实例化bean的方式
一、概述 所谓实例化bean,大白话讲就是Spring如何把这一个个的普通的Java对象创建为Spring bean的。 二、方式 Spring中实例化bean常用的有以下四种,即: ① 构造器方式; ② 静态工厂方式; ③ 实例工厂方式;…...
WordPress无插件实现css、js加速 实现动静态分离
“Wordpress网站现在普遍较慢”,其实是没有做好优化罢了,像我的网站生成页面的时间才0.06s,而且我这网站还有提速的机会呢,如css、js使用CDN加速,实现动静态分离,我安装过,Memcache和PHP加速脚本就已经让我…...
2017年五一杯数学建模B题自媒体时代的消息传播问题解题全过程文档及程序
2017年五一杯数学建模 B题 自媒体时代的消息传播问题 原题再现 电视剧《人民的名义》中人物侯亮平说:“现在是自媒体时代,任何突发性事件几分钟就传播到全世界。”相对于传统媒体,以互联网技术为基础的自媒体以其信息传播的即时性、交往方式…...
虹科分享 | AR世界揭秘:从二维码的起源到数据识别与位姿技术的奇妙融合!
引言:探索AR的神奇世界,我们将从二维码的诞生谈起。在这个科技的海洋中,二维码是如何帮助AR实现数据获取与位姿识别的呢?让我们一起揭开这层神秘的面纱! 一、二维码的由来 二维码是将数据存储在图形中的技术ÿ…...
基于helm部署并配置StorageClass
此类方法适用于测试环境或者小型的集群环境,因为nfs是网络文件系统,在io性能上并不能有所保证。 前置条件: 已部署k8s集群已安装helm 工具 step1: 安装nfs服务 yum install nfs-utils -ystep2: 配置nfs # 编辑/etc/exports /data/nfs *(r…...
Python基础:字符串详解(需补充完善)
1. 字符串定义 在Python中,字符串是一种数据类型,用于表示文本数据。字符串是由字符组成的序列,可以包含字母、数字、符号和空格等字符。在Python中,你可以使用单引号()或双引号("&#x…...
做直播服务器要什么样的配置呢?
现在直播行业越来越火爆,大大小小的平台或者企业都选择通过直播卖货的方式出售产品,直播的内容还有观看直播的人数等等都影响了服务器的配置需求,今天小编就给大家讲一讲吧! 1、内存:直播服务器需要足够的内存才能支持…...
⑥【bitmap 】Redis数据类型: bitmap [使用手册]
个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ Redis bitmap ⑥Redis bitmap 基本操作命令1. …...
CentOS升级GCC
背景 CentOS 7默认自带GCC版本4.8,而目前工作中开发环境需要用到GCC8和GCC12,这里记录一下如何升级GCC版本,以及如何多版本并存。参考: CentOS升级gcc-知乎 Redhat7上安装Red Hat Developer Toolset并自由切换gcc和g的版本 Cent…...
CodeWhisperer 体验总结
CodeWhisperer 体验总结 | CodeWhisperer 是一款亚马逊新推出的通用代码生成器 可以实时进行代码数据的提供 还可以定义安全问题 CodeWhisperer 对个人用户是免费使用 企业用户需要订阅使用 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例…...
Apache换行解析漏洞(CVE-2017-15715)
漏洞简介 Apache換行解析漏洞(CVE-2017-15715)是一种解析漏洞,可以影响httpd 2.4.0至2.4.29版本中的PHP解析。攻击者可以通过在上传的文件名中添加特定的换行符,绕过服务器的安全策略,使其被解析成PHP文件而不是普通文件。此漏洞会影响具有以下条件的服务器: 未正确配置…...
人工智能时代的内容写作
内容不再只是王道,正如俗话所说:它是一种流动的货币,推动了巨大的在线信息和影响力经济。 每个品牌都是一个故事,通过其服务和商品讲述自己。尽管如此,大多数客户还是会通过您的在线内容最了解您。 但随着我们进入人…...
大模型测试用例自动生成不是“写提示词”:基于形式化规约+符号执行+反事实扰动的三层生成引擎(附GitHub开源框架v2.3)
第一章:大模型工程化测试用例自动生成 2026奇点智能技术大会(https://ml-summit.org) 大模型工程化落地过程中,测试环节长期面临覆盖率低、人工编写成本高、语义边界模糊等核心挑战。传统基于规则或模板的测试生成方法难以应对LLM输出的非确定性、上下文…...
## 015、AutoSAR CP实战:配置存储栈(NvM,Fee,Ea)
深夜的产线问题 产线突然报过来一个诡异问题:车辆下电后重新上电,里程表数据偶尔会跳回三天前的数值。抓了三天Log,发现每当Flash擦除时电压有轻微波动,问题就复现。这直接把我们引向了存储栈的配置——NvM、Fee、Ea这套组合拳,任何一个参数配歪了,都是量产时的定时炸弹…...
别再只调参了!用Python给CFD/CAE仿真结果加个‘AI修正器’,精度提升看得见
用Python构建CFD/CAE仿真AI修正器的工程实践指南 在工程仿真领域,我们常常遇到一个令人头疼的问题:经过精心设置的CFD/CAE仿真结果,与实验数据之间总存在一条难以跨越的"误差鸿沟"。传统解决方案往往是反复调整网格、修改参数或更换…...
lvgl-micropython、lv_micropython和lv_binding_micropython到底啥关系?一文读懂冈
一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作,需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释(因业务实际需要存储大数值关联字段)。 表的核心特性为Java 多线程密集读写,业务请求持续高…...
3步轻松优化Windows系统:Winhance中文版让你的电脑飞起来!
3步轻松优化Windows系统:Winhance中文版让你的电脑飞起来! 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors…...
在超大数据集下 DuckDB 与 MySQL 查询速度对比迂
一、什么是urllib3? urllib3 是一个用于处理 HTTP 请求和连接池的强大、用户友好的 Python 库。 它可以帮助你: 发送各种 HTTP 请求(GET, POST, PUT, DELETE等)。 管理连接池,提高网络请求效率。 处理重试和重定向。 支…...
网站反爬机制的技术架构与演进
在数字经济时代,数据作为核心生产要素,其安全与合规管控已成为网站运营的核心命题。爬虫技术的迭代升级,不仅对网站数据主权构成冲击,更可能引发服务器过载、核心数据泄露等运营风险,反爬机制作为应对该类风险的核心技…...
PromptOps新范式:支持语义比对、影响面分析、自动回归测试的提示词版本引擎(附开源POC)
第一章:大模型工程化中的提示词版本管理 2026奇点智能技术大会(https://ml-summit.org) 在大模型落地实践中,提示词(Prompt)已从临时调试脚本演变为关键生产资产——其质量、可复现性与可审计性直接影响推理稳定性、业务指标合规…...
2026奇点大会闭门报告泄露(含原始benchmark数据):多轮对话SOTA模型在长记忆场景下的5项隐性衰减指标
第一章:2026奇点智能技术大会:大模型多轮对话 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上,大模型多轮对话能力成为核心议题之一。与会研究者展示了新一代对话系统在长程上下文建模、意图漂移检测与跨轮记忆对齐…...
保姆级教程:用Depth Anything V3从手机照片生成3D高斯模型(附完整代码)
保姆级教程:用Depth Anything V3从手机照片生成3D高斯模型(附完整代码) 在数字艺术和游戏开发领域,3D建模一直是专业门槛较高的技术环节。传统流程需要昂贵的激光扫描设备或复杂的摄影测量工作室,而今天我们将颠覆这一…...
