第二章:C/C++内存管理
1、五大分区核心定义与特性在Linux操作系统下C/C程序运行时用户态内存会被操作系统划分为5个固定区域从上至下依次为内核空间、栈、内存映射段、堆、数据段、代码段常量区。内核空间用户程序无权读写访问由操作系统内核专属使用用于管理进程调度、硬件驱动、系统调用。1.栈向下增长由编译器自动分配、自动释放生命周期跟随函数栈帧。存放局部非静态变量、函数形参、函数返回地址、数组局部变量。2.内存映射段是高效的I/O映射方式用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存做进程间通信。3.堆向上增长用于动态内存分配。4.数据段静态区存储全局变量和静态变量。5.代码段常量区存放可执行的代码、只读常量、字符串字面量。2、代码实例分区定位分析答案C C C A A A A A D A B解析1. globalVar ——C 数据段已初始化全局变量2. staticGlobalVar ——C 数据段全局静态变量3. staticVar ——C 数据段局部静态变量存静态区不进栈4. localVar ——A 栈普通局部变量函数栈帧5. num1 ——A 栈局部数组数组整体开辟在栈上6. char2 ——A 栈字符数组数组本体在栈初始化时把常量区abcd拷贝至栈空间7. *char2 ——A 栈数组首元素位于栈内存8. pChar3 ——A 栈指针变量本身是局部变量存在栈上9. *pChar3 ——D 代码段指针指向字符串字面量字面量存放于只读常量区10. ptr1 ——A 栈指针变量本体在栈11. *ptr1 ——B 堆指针指向malloc开辟的堆内存空间核心易错点1. char char2[] abcd;数组名char2存放在栈区程序执行时会将常量区的字符串字面量abcd\0拷贝一份到栈上数组空间因此可以修改char2[0]x不会报错。2. const char* pChar3 abcd;指针变量pChar3本体存放在栈区指针仅保存常量区字符串abcd\0的地址字符串本体在只读代码段尝试修改*pChar3x程序直接触发段错误。3. int* ptr1 malloc();指针ptr1本体存放在栈区malloc向操作系统申请堆内存指针存储堆空间起始地址*ptr1访问堆内存堆内存必须手动free释放。3、C语言中动态内存管理方式malloc/calloc/realloc/freevoid Test () { // 1.malloc/calloc/realloc的区别是什么 int* p2 (int*)calloc(4, sizeof (int)); int* p3 (int*)realloc(p2, sizeof(int)*10); // 这里需要free(p2)吗 free(p3); }这里不清晰的同学可以回顾一下之前的内容动态内存管理1-CSDN博客4、C动态内存管理new/deleteC语言内存管理方式在C中可以继续使用但有些地方就无能为力而且使用起来比较麻烦因此C又提出了自己的内存管理方式通过new和delete操作符进行动态内存管理。4.1 new/delete操作内置类型语法规范单个对象new 严格匹配 delete连续数组空间new[] 严格匹配 delete[]交叉混用会产生未定义行为大概率造成内存泄漏程序崩溃。4.2 new和delete操作自定义类型malloc/free只分配一块原始堆内存不会调用构造、析构函数对象无法完成合法初始化与资源清理new/delete分配内存 自动调用构造函数初始化对象释放前自动调用析构函数清理成员堆资源。4.2.1 代码对比演示class A { public: A(int a 0) : _a(a) { cout A(): this endl; } ~A() { cout ~A(): this endl; } private: int _a; }; int main() { // new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】 // 除了开空间还会调用构造函数和析构函数 A* p1 (A*)malloc(sizeof(A)); A* p2 new A(1); free(p1); delete p2; // 内置类型是几乎是一样的 int* p3 (int*)malloc(sizeof(int)); // C int* p4 new int; free(p3); delete p4; A* p5 (A*)malloc(sizeof(A) * 10); A* p6 new A[10]; free(p5); delete[] p6; return 0; }4.3 operator new与operator delete函数new、delete是运算符并非底层内存分配函数其底层会自动调用系统全局函数operator new、operator delete两个底层函数本质是对malloc/free的封装。4.3.1 operator new 底层逻辑1. 内部调用malloc申请指定字节堆内存2. 内存申请成功直接返回堆内存起始指针3. 内存申请失败不会返回NULL默认抛出bad_alloc异常需要开发者使用try-catch捕获。4.3.2 operator delete 底层逻辑内部直接封装free函数仅负责把传入的堆内存归还操作系统无额外逻辑。4.3.3new运算符执行完整两步流程1. 调用operator new函数申请空间2. 在申请的空间上执行构造函数完成对象的构造初始化反汇编如下4.3.4 delete运算符执行完整两步流程1. 在空间上执行析构函数完成对象中资源的清理工作2. 调用operator delete函数释放对象的空间反汇编如下4.4 new[] 与 delete[]动态创建对象数组当需要在堆上批量创建多个同类对象时使用new[]释放必须严格配套delete[]。4.4.1 执行原理1. new[]调用operator new[]批量申请一整片连续堆内存循环N次调用构造函数逐个初始化数组内每一个对象2. delete[]循环N次调用析构函数逐个销毁数组内对象、清理资源最后调用operator delete[]释放整片连续堆内存。4.4.2 底层隐藏内存布局示例代码int main() { // 堆上创建10个A对象自动执行10次构造函数 A* arr new A[10]; // 必须使用delete[]执行10次析构函数再释放整片数组内存 delete[] arr; return 0; }编译器执行new A[10]时会在数组首地址向前预留一块隐藏4字节空间专门存储数组元素个数本例存储10。delete[]会读取该隐藏数值确定析构函数调用次数若释放时漏写[]无法读取元素个数只会调用1次析构函数剩余9个对象资源泄漏严重时程序直接宕机。5、malloc/free和new/delete的区别malloc/free和new/delete的共同点是都是从堆上申请空间并且需要用户手动释放。不同的地方是1. malloc和free是函数new和delete是操作符2. malloc申请的空间不会初始化new可以初始化3. malloc申请空间时需要手动计算空间大小并传递new只需在其后跟上空间的类型即可如果是多个对象[]中指定对象个数即可4. malloc的返回值为void*, 在使用时必须强转new不需要因为new后跟的是空间的类型5. malloc申请空间失败时返回的是NULL因此使用时必须判空new不需要但是new需要捕获异常6. 申请自定义类型对象时malloc/free只会开辟空间不会调用构造函数与析构函数而new在申请空间后会调用构造函数完成对象的初始化delete在释放空间前会调用析构函数完成空间中资源的清理释放

相关新闻

微PE安装Windows 10/11全攻略:从启动盘制作到驱动优化

微PE安装Windows 10/11全攻略:从启动盘制作到驱动优化

1. 项目概述:为什么微PE是系统安装的“瑞士军刀” 如果你经常折腾电脑,或者需要帮朋友、同事处理系统问题,那么一个干净、强大的PE工具是必不可少的。在众多PE工具中,微PE工具箱以其纯净无广告、内核精简高效、工具实用而广受好评…

2026/9/26 10:47:48 阅读更多 →
【C++ 面试真题】inline 函数真的会被“内联“吗?

【C++ 面试真题】inline 函数真的会被“内联“吗?

【C 面试真题】inline 函数真的会被"内联"吗?inline 是 C 里误解最深的关键字之一。很多人以为"加了 inline 就一定会被展开",或"没加 inline 就一定不会展开"——两个都是错的。这道题考的不是语法,而是你对编…

2026/9/26 7:33:13 阅读更多 →
【数字信号处理含matlab代码】第十四篇(最终篇):综合实战——从语音采集到滤波分析的系统级串联

【数字信号处理含matlab代码】第十四篇(最终篇):综合实战——从语音采集到滤波分析的系统级串联

第十四篇(最终篇):综合实战——从语音采集到滤波分析的系统级串联 历时十三篇,我们从线性相位 FIR 的幅度响应一路走到了语音端点分割,积累了 14 个核心工具。今天,我们终于要将它们全部串联起来&#xff0…

2026/9/26 15:28:58 阅读更多 →

最新新闻

Python f-string性能原理与工程实践指南

Python f-string性能原理与工程实践指南

1. 为什么我彻底停用了.format()和%,只用 f-string?三年前我还在带一个刚转行的实习生,他写了一段爬虫日志记录代码:log_msg "Request to {url} failed with status {code}, retrying {count} times".format(urlendpoi…

2026/9/27 0:51:05 阅读更多 →
Agentic调度系统:面向智能体的原生Kubernetes编排方案

Agentic调度系统:面向智能体的原生Kubernetes编排方案

1. 项目概述:从“ax”这个极简标题切入,我们到底在谈什么?“ax”——两个字母,没有空格,没有标点,没有上下文。乍一看像缩写、像代号、像密码,甚至像打字错误。但结合当前技术社区高频出现的热搜…

2026/9/27 0:51:05 阅读更多 →
如何开发FluentTweaker扩展:元数据、Host模式与参数传递完整参考

如何开发FluentTweaker扩展:元数据、Host模式与参数传递完整参考

如何开发FluentTweaker扩展:元数据、Host模式与参数传递完整参考 【免费下载链接】FluentTweaker Windows Slop Remover 项目地址: https://gitcode.com/gh_mirrors/wi/FluentTweaker FluentTweaker(Windows Slop Remover)是一款开源的…

2026/9/27 0:51:05 阅读更多 →
Agent Cookie Sync:Grok Bot与Muse的Chrome会话同步实践

Agent Cookie Sync:Grok Bot与Muse的Chrome会话同步实践

1. 从"登录态丢失"说起:Agent Cookie Sync 到底在解决什么做过浏览器自动化的人大概率都遇到过这个场景:脚本跑得好好的,突然某一天所有请求全部返回未登录,页面跳回登录页,之前辛苦维持的会话状态一夜清零。…

2026/9/27 0:51:05 阅读更多 →
企业高端网站制作避坑指南:5个技术选型坑,让网站真正被搜到

企业高端网站制作避坑指南:5个技术选型坑,让网站真正被搜到

企业高端网站制作避坑指南:5个技术选型坑,让网站真正被搜到 网站做好了没人访问,这是90%企业老板最头疼的事。不是设计不够炫,也不是功能不够多,而是从底层架构到前端代码,每一步都在为SEO埋雷。我见过太多案例:花三十万做的官网,百度收录不到…

2026/9/27 0:51:05 阅读更多 →
codex-app-mirror如何15分钟发现Codex新版?“探测→比对→发布“镜像管道全拆解

codex-app-mirror如何15分钟发现Codex新版?“探测→比对→发布“镜像管道全拆解

codex-app-mirror如何15分钟发现Codex新版?"探测→比对→发布"镜像管道全拆解 【免费下载链接】codex-app-mirror 原样镜像官方 Codex 桌面应用:每 15 分钟探测、SHA256 可校验、国内直连下载、 Mac 可增量更新 | Verbatim, verifiable mirror of the off…

2026/9/27 0:50:04 阅读更多 →

日新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/27 0:00:34 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/27 0:00:34 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/27 0:00:34 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/26 22:52:30 阅读更多 →