news 2026/5/15 8:16:00

C++内存管理:从malloc到new的进化之路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++内存管理:从malloc到new的进化之路

在学习相关内容之前,我们先来做一道题目:

分析:globalvar是一个全局变量,所以globalvar在静态区;static GlobalVar被static修饰,说明它是一个静态变量,那就在静态区;static Var在静态区;localVar是一个局部变量,局部变量的空间都是在桟帧中开辟的,所以在栈上;num1单独出现,表示数组首元素的地址,那它就是一个指针变量,在栈上;char2表示数组名,为首元素地址,字符串存储在数组中,这个字符串是可以被修改的,那么这个字符串就是在栈上,那char2就在栈上;*char2表示首元素,也在栈上;pchar3是一个指针变量,在栈上;const char* pchar3="abcd"中的const修饰的是指针指向的内容,这个内容不能被修改,这个字符串为常量字符串,在常量区,*pchar3就在常量区;ptr1中存放的是申请空间的地址,是一个指针变量,在栈上;*ptr1表示申请空间的首元素,空间是在堆上申请的,所以*ptr1在堆上。

选择题答案

globalVar在哪里?______C. 数据段(静态区)

  • 全局变量存储在静态区(数据段)

staticGlobalVar在哪里?______C. 数据段(静态区)

  • static修饰的全局变量也存储在静态区

staticVar在哪里?______C. 数据段(静态区)

  • 函数内的static局部变量也存储在静态区

localVar在哪里?______A. 栈

  • 普通局部变量在栈上

num1 在哪里?______A. 栈

  • 数组名代表数组首地址,但数组本身在栈上

char2在哪里?______A. 栈

  • 局部字符数组,整个数组在栈上

*char2在哪里?______A. 栈

  • 数组首元素在栈上

pChar3在哪里?______A. 栈

  • 指针变量本身在栈上

*pChar3在哪里?______D. 代码段(常量区)

  • 指向的字符串"abcd"是常量字符串,在常量区

ptr1在哪里?______A. 栈

  • 指针变量本身在栈上

*ptr1在哪里?______B. 堆

  • malloc分配的内存空间在堆上

图示解释:

正文
一、C语言中的内存管理

回顾前面在C语言中的学习,我们学习过malloc/calloc/realloc/free,我们通过题目来回顾一下:

【面试题】

1. malloc/calloc/realloc的区别?

malloc申请空间时不进行初始化,calloc申请空间时自动初始化为0;realloc是对空间的增容:如果原空间后面有空间,那直接在其后面直接扩容,新空间的地址和原空间的地址一样;如果原空间的后面空间不够,则新找一块空间,并将原空间中的数据拷贝到新空间中,再将原空间释放,然后返回新空间的地址

2. malloc的实现原理? glibc中malloc实现原理

其实C语言中的内存管理已经可以解决很多问题,那为什么C++中要搞个新的内存管理呢?ok,通过下面的学习,我们就知道原因了:

二、C++内存管理
2.1 初识new和delete

C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式——通过new和delete操作符进行动态内存管理。

2.2 new和delete
2.2.1 new的使用

那这时候就有人想问了,如果我们想要初始化,该怎么做?

2.2.2 delete的使用

delete的使用分为两种情况: 情况1:释放单个

代码语言:javascript

AI代码解释

//申请一个int类型的空间,并初始化 int* p3 = new int(10); //释放单个 delete p3;

情况2:释放多个

代码语言:javascript

AI代码解释

//申请一个空间大小为10的数组,int类型,并部分初始化 int* p4 = new int[10] {1, 2, 3, 4}; //释放多个 delete[] p4;

提醒:释放多个也可以直接写delete p4; 但是不建议这么写

这里博主有一个问题:我们看啊,在C中有申请空间,还有扩容,刚才我们学习C++中的申请空间,那C++中有扩容吗?

其实是没有的,如果需要扩容,自己手动扩

我们看到其实new和delete的功能和malloc、calloc、free的功能很接近,那为什么祖师爷还要搞new和dlete呢?其实是为了自定义类型,用malloc可以申请一个自定义类型的空间,那该怎么初始化呢?这是不是一个问题,那为了解决这个问题,祖师爷就搞出了new和delete.



版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 8:05:55

ComfyUI集成大语言模型:打造智能AI绘画工作流

1. 项目概述:当ComfyUI遇上大语言模型最近在玩ComfyUI,发现一个挺有意思的插件项目,叫ainewsto/Comfyui-chatgpt-api。简单来说,它就是一个桥接器,把ComfyUI这个强大的图像生成工作流编排工具,和以ChatGPT为…

作者头像 李华
网站建设 2026/5/15 8:04:48

ARMv8异常处理与HSR寄存器深度解析

1. ARMv8异常处理机制与HSR寄存器概述在ARMv8架构中,异常处理机制是确保系统可靠性的核心基础设施。当处理器执行过程中遇到非法指令、内存访问错误或外部中断等异常情况时,系统需要准确捕获异常现场并快速转入处理流程。HSR(Hyp Syndrome Re…

作者头像 李华
网站建设 2026/5/15 8:04:37

初级程序员高频提示词(Prompt Engineering)

针对 3 年以内工作经验 的程序员,高频提示词的优化原则是:降低歧义、明确边界、给出错误处理、提供检查清单。这个阶段的工程师最怕的不是“不会写代码”,而是“写出来的代码在测试/上线后暴露出各种低级问题”。 以下是一组特别有用且经过优化的高频提示词列表,每个提示词…

作者头像 李华
网站建设 2026/5/15 8:03:06

3分钟学会使用Unlock Music:浏览器内一键解密你的加密音乐文件

3分钟学会使用Unlock Music:浏览器内一键解密你的加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址…

作者头像 李华