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

【C++】C/C++ 内存管理从入门到进阶

【相关题目】代码语言javascriptAI代码解释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); }1. 选择题选项: A.栈 B.堆 C.数据段(静态区) D.代码段(常量区)globalVar在哪里 C staticGlobalVar在哪里__C__ staticVar在哪里__C__ localVar在哪里__A__ num1 在哪里__A__【分析】:globalVar全局变量在数据段staticGlobalVar静态全局变量在静态区staticVar静态局部变量在静态区localVar局部变量在栈区num1局部变量在栈区char2在哪里__A__ *char2在哪里__A__pChar3在哪里__A__ *pChar3在哪里__D__ptr1在哪里__A__ *ptr1在哪里__B__【分析】:char2局部变量在栈区char2是一个数组把后面常量串拷贝过来到数组中数组在栈上所以*char2在栈上pChar3局部变量在栈区*pChar3得到的是字符串常量字符在代码段ptr1局部变量在栈区*ptr1得到的是动态申请空间的数据在堆区2. 填空题sizeof(num1) __40__; //数组大小,10个整形数据一共40字节 sizeof(char2) __5__; //包括\0的空间 strlen(char2) __4__; //不包括\0的长度 sizeof(pChar3) __4__; //pChar3为指针 strlen(pChar3) __4__; //字符串“abcd”的长度不包括\0的长度 sizeof(ptr1) __4__; //ptr1是指针二、栈与堆对比栈和堆是日常开发中最常接触的内存区域二者的差异直接决定了使用场景的选择以下是全方位对比特性栈区Stack堆区Heap管理方式编译器自动分配释放程序员手动通过new/delete等接口管理空间大小较小几 MB较大受系统内存限制访问速度极快栈指针操作较慢需内存寻址生命周期随作用域自动销毁显式释放前持续存在内存碎片无频繁分配释放易产生碎片增长方向从高地址到低地址从低地址到高地址典型场景局部变量、函数参数大对象、跨作用域数据风险点栈溢出过大局部变量内存泄漏未释放、野指针三、动态内存管理C 和 C 都支持堆内存的动态管理但提供了不同的接口使用时需注意语法规范和匹配原则避免混用导致内存问题。1. C语言malloc/calloc/realloc与freemalloc(size_t size)分配指定字节数的堆内存返回 void * 指针需手动类型转换。calloc(size_t num, size_t size)分配 num 个大小为 size 的连续内存初始化为 0。realloc(void* ptr, size_t size)调整已分配内存的大小可能会移动内存块。free(void* ptr)释放通过上述函数分配的堆内存ptr 必须指向堆内存起始地址。【示例代码】代码语言javascriptAI代码解释#include stdio.h #include stdlib.h int main() { // 1. malloc分配内存不初始化 int* m (int*)malloc(2 * sizeof(int)); m[0] 1; m[1] 2; printf(malloc: %d, %d\n, m[0], m[1]); // 2. calloc分配并初始化为0 int* c (int*)calloc(2, sizeof(int)); printf(calloc: %d, %d\n, c[0], c[1]); // 3. realloc扩容malloc的内存 m (int*)realloc(m, 3 * sizeof(int)); m[2] 3; printf(realloc后: %d, %d, %d\n, m[0], m[1], m[2]); // 4. free释放内存 free(m); free(c); return 0; }2. Cnew/delete与new[]/delete[]C 在 C 的基础上提供了更安全的动态内存接口支持对象的构造和析构new T****分配单个 T 类型对象的内存自动调用构造函数初始化。new T[n]****分配 n 个 T 类型对象的数组内存自动调用每个对象的构造函数。delete ptr****自动调用析构函数释放单个对象内存。delete[] ptr****自动调用每个对象的析构函数释放数组内存。【注意】接口必须成对使用new对应deletenew[]对应delete[]混用会导致内存泄漏或程序崩溃。无需手动类型转换new返回对应类型指针且分配失败时抛出bad_alloc异常而非返回 NULL。【示例代码】代码语言javascriptAI代码解释int main() { //内置类型 int* a2 new int;//不初始化 delete a2; int* a3 new int(1);//初始化 delete a3; int* a4 new int[4];//数组~不初始化 delete[] a4; int* a5 new int[4] {1, 2, 3, 4};//数组~初始化不完全初始化的话未初始化的都会被初始化为0 delete[] a5; //自定义类型~用法和内置类型同理 // new/delete 和 malloc/free最大区别是: // new/delete对于【自定义类型】除了开空间还会调用构造函数和析构函数 return 0; }【面试题】malloc/calloc/realloc的区别malloc 、 calloc 、 realloc 的区别主要在三点参数不同malloc 是单参数总字节数 calloc 是双参数元素个数单个大小 realloc 是双参数原地址新字节数。初始化不同malloc 分配的内存未初始化 calloc 会自动初始化为0 realloc 的新增部分未初始化。功能不同malloc 和 calloc 是首次分配内存 realloc 是调整已分配内存的大小。【问题】这里需要free(p2)吗代码语言javascriptAI代码解释void Test () { int* p2 (int*)calloc(4, sizeof (int)); int* p3 (int*)realloc(p2, sizeof(int)*10); free(p3 ); }不需要free(p2)无论是异地扩容还是原地扩容最终都不需要专门释放p2如果是原地扩容p1和p2指向同一块空间如果是异地的话将原内容拷贝后会自动释放原来p2指向的空间四、operator new/operator delete函数new和delete是用户进行动态内存申请和释放的操作符operator new 和operator delete是系统提供的全局函数new在底层调用operator new全局函数来申请空间delete在底层通过operator delete全局函数来释放空间但是追踪到底还是会调用malloc和free因为毕竟c兼容C语言有现成开空间的函数直接调用不就行了呗下面是operator new函数源码malloc失败返回空new失败抛异常后面会学到【new底层汇编】从图中可以看到是先调用operator new再调用相对应的构造函数【delete底层汇编】delete的底层是先调用析构函数然后再调用operator delete【模拟栈对象如何在堆上申请/释放空间】先为栈对象开空间然后调用该对象的构造函数为_array开辟空间最终让栈上的p1指针指向堆上的对象栈对象和栈内存区域是两个不同领域的概念

相关文章:

【C++】C/C++ 内存管理从入门到进阶

【相关题目】 代码语言:javascript AI代码解释 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*…...

AI Agent编排实战:OPC v5.0如何实现多智能体协作与工程化任务管理

1. 项目概述:一人公司的AI CEO最近在折腾AI Agent编排,发现了一个挺有意思的项目,叫OPC(One-Person Company)。简单来说,它不是一个独立的AI应用,而是一个给OpenClaw这个AI智能体平台用的“技能…...

从零部署全能Discord机器人:模块化设计与实战优化指南

1. 项目概述:一个全能型Discord机器人的诞生最近在Discord社区里折腾一个叫“Big Boss Bot”的机器人,项目地址是kitakitsune0x/bigbossbot。这名字听起来就挺有气势的,对吧?它本质上是一个功能丰富的Discord机器人,旨…...

5分钟搞定B站视频备份:m4s-converter完整使用教程

5分钟搞定B站视频备份:m4s-converter完整使用教程 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否遇到过这样的情况&#xff1…...

AI智能体规划框架skill-daydreaming:让AI像人一样思考与执行复杂任务

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫“skill-daydreaming”,作者是regiep4。光看这个名字,你可能觉得有点玄乎——“技能白日梦”?这到底是干嘛的?作为一个在AI和自动化工具领域折腾了十多年…...

VSCode连接Ubuntu虚拟机(VMware/VirtualBox)编辑文件,总提示Permission Denied?可能是这个共享文件夹权限问题

VSCode连接Ubuntu虚拟机编辑文件时Permission Denied的深度解决方案 跨平台开发已经成为现代开发者的标配工作流,而VSCode配合虚拟机更是常见的开发环境组合。但当你兴致勃勃地在Windows或macOS上通过VSCode连接到Ubuntu虚拟机,准备大展拳脚时&#xff0…...

PX4-Autopilot嵌入式系统实时监控与状态监测算法深度解析

PX4-Autopilot嵌入式系统实时监控与状态监测算法深度解析 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot PX4-Autopilot作为开源无人机飞控系统的代表性项目,其状态监测算法在嵌入式系统…...

ReMe开源框架:突破AI智能体上下文限制与状态丢失的长期记忆管理方案

1. 项目概述与核心价值 如果你正在构建一个需要长期记忆的AI智能体,比如一个能记住你编程偏好的代码助手,或者一个能追踪用户历史问题的客服机器人,那么你肯定遇到过两个让人头疼的“顽疾”: 上下文窗口限制 和 会话状态丢失 …...

芯片良率提升:从设计到制造的系统性工程实践

1. 项目概述:从“能用”到“好用”的生死线“芯片良率”这四个字,对于圈外人来说,可能只是个模糊的技术指标。但对于身处半导体行业,无论是设计、制造、封测还是终端应用环节的从业者而言,它是一条贯穿始终、关乎生死存…...

数据科学协作新范式:构建可复现、可追溯的“小宇宙”项目

1. 项目概述:从“小宇宙”到数据科学协作的范式革新最近在GitHub上闲逛,发现了一个挺有意思的项目——datawhalechina/tiny-universe。乍一看这个名字,“小宇宙”,感觉有点玄乎,但点进去仔细研究后,发现它远…...

如何构建教育机构专属的离线编程教学平台:CodeCombat私有化部署实战

如何构建教育机构专属的离线编程教学平台:CodeCombat私有化部署实战 【免费下载链接】codecombat Game for learning how to code. 项目地址: https://gitcode.com/gh_mirrors/co/codecombat 你是否曾面临这样的困境:当50名学生同时在线编程时&am…...

开源客户端工具设计:从API封装到健壮实现的工程实践

1. 项目概述:一个开源客户端工具的诞生与价值在开源世界里,我们经常会遇到一些功能强大但使用门槛较高的服务端项目。它们往往提供了核心的API或服务,但缺少一个能让普通用户或开发者快速上手、直观操作的“门面”。lotsoftick/openclaw_clie…...

5个理由告诉你为什么Karate是API测试自动化的终极解决方案

5个理由告诉你为什么Karate是API测试自动化的终极解决方案 【免费下载链接】karate Test Automation Made Simple 项目地址: https://gitcode.com/gh_mirrors/ka/karate Karate测试框架是一个革命性的开源工具,它将API测试、Mock服务、性能测试和UI自动化完美…...

利用 Taotoken 统一管理多个项目的 API 密钥与访问权限

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 利用 Taotoken 统一管理多个项目的 API 密钥与访问权限 在同时维护多个 AI 应用或为不同客户部署服务的场景中,管理不同…...

构建数字灵魂:从知识管理到AI智能体的个人数字资产管理指南

1. 项目概述与核心价值最近在整理个人知识库和开源项目时,我偶然发现了一个名为“awesome-digital-souls”的仓库,它来自开发者haowei-freesky。这个标题本身就充满了想象力——“数字灵魂”。乍一看,你可能会联想到科幻电影里关于意识上传、…...

ARM调试接口技术:SWD与JTAG协议切换机制详解

1. ARM调试接口技术深度解析 在嵌入式系统开发领域,调试接口如同工程师的"听诊器",是连接开发环境与目标芯片的重要通道。作为行业标准,ARM架构提供了两种主流的调试协议:串行线调试(SWD)和JTAG。这两种协议各有特点&am…...

基于AIGC的文本生成视频系统:从架构设计到工程实践

1. 项目概述:从文本到视频的自动化创作最近在折腾一个挺有意思的项目,叫“TextCreateVideo”,直译过来就是“文本生成视频”。这玩意儿听起来像是科幻电影里的概念,但现在已经有不少开源项目在尝试落地了。我关注的这个Anning01/T…...

VoLTE技术解析:4G语音实现原理与优化实践

1. VoLTE技术概述VoLTE(Voice over LTE)作为4G LTE网络上的语音解决方案,从根本上改变了传统移动语音的传输方式。这项技术将语音信号数字化为IP数据包,通过LTE网络的全IP架构进行传输,完全摆脱了2G/3G时代依赖的电路交…...

DPDK 教程(三):多队列 + RSS + 多 worker 的最小转发 / Echo

DPDK 教程(三):多队列 RSS 多 worker 的最小转发 / Echo 本文对应学习路径第三步:在理解 ethdev/mbuf/mempool 后,做一个最小可运行的转发或 echo 原型,刻意使用 多 RX 队列 RSS 把流量分散到 多个 work…...

【2026最新】英文论文降AIGC实测:拒绝盲目换词,工具盘点与3种手动修改方法

马上要临近答辩了,还有的同学在发愁英文摘要和全英文章怎么降低aigc率。英文文本的句式本来就很固定,比如大量的被动语态和从句,这就很容易被系统标记,尤其对于我们这种非英语母语者来说,更是无从下手。 今天我就结合…...

ARM安全调试与跟踪机制详解

1. ARM安全调试与跟踪机制概述在ARMv8/v9架构的安全扩展中,调试与跟踪机制的设计直接关系到系统的整体安全性。现代处理器需要同时满足开发调试的便利性和生产环境的安全隔离需求,这就对调试子系统提出了精细化的访问控制要求。以MDCR_EL3(Mo…...

Ollama Web UI部署指南:EVA项目实战与本地大模型管理

1. 项目概述:当开源AI助手遇上本地化部署最近在折腾本地大语言模型部署的朋友,可能都绕不开一个名字:Ollama。它确实让拉取和运行各种开源模型变得像ollama run llama3一样简单。但不知道你有没有和我一样的感受——用久了命令行,…...

如何轻松提取Wallpaper Engine壁纸资源:RePKG完整实用指南

如何轻松提取Wallpaper Engine壁纸资源:RePKG完整实用指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 你是否曾经遇到过这样的困扰:下载了精美的Wallpap…...

自进化AI智能体:从核心架构到工程实践

1. 项目概述:从“自进化”到“智能体协作”的范式跃迁最近在GitHub上看到一个名为“RangeKing/self-evolving-agent”的项目,这个标题本身就充满了吸引力。作为一个长期关注AI Agent(智能体)领域发展的从业者,我深知“…...

AI Agent vs RPA/脚本自动化:5个维度数据对比揭示2024年企业自动化升级的生死分水岭

更多请点击: https://intelliparadigm.com 第一章:AI Agent与传统自动化的本质差异 AI Agent 并非自动化脚本的简单升级,而是在认知架构、决策闭环和环境交互维度上实现范式跃迁。传统自动化(如 cron 任务、RPA 工具)…...

终极指南:3秒快速预览Office文档,无需安装完整Office套件

终极指南:3秒快速预览Office文档,无需安装完整Office套件 【免费下载链接】QuickLook.Plugin.OfficeViewer Word, Excel, and PowerPoint plugin for QuickLook. 项目地址: https://gitcode.com/gh_mirrors/qu/QuickLook.Plugin.OfficeViewer 在W…...

高端酒庄都在偷用的印相秘技:基于真实酒液折射率建模的--iw 2.8微调法(附光学参数对照速查卡)

更多请点击: https://intelliparadigm.com 第一章:高端酒庄印相美学的光学本质解构 高端酒庄的视觉识别系统——尤其是瓶标、酒窖导视与品鉴手册中的“印相美学”,并非仅关乎设计风格,其底层实为光与物质交互的精密光学工程。当光…...

基于RAG与本地化部署的Obsidian智能知识库助手实战指南

1. 项目概述:当知识管理遇上AI副驾驶如果你和我一样,常年泡在Obsidian这个知识管理的“第二大脑”里,那你一定对那种感觉不陌生:笔记越积越多,知识网络越来越复杂,但当你真正需要调用某个信息、串联某个想法…...

三步解锁WeMod Pro高级功能:Wand-Enhancer终极免费方案

三步解锁WeMod Pro高级功能:Wand-Enhancer终极免费方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 想要完全免费享受WeMod Pro的所有高级…...

Java AI集成实战:ai4j项目解析与生产环境应用指南

1. 项目概述与核心价值 最近在开源社区里,一个名为 LnYo-Cly/ai4j 的项目引起了我的注意。乍一看这个标题,你可能会有点懵——“ai4j”?是“AI for Java”的缩写吗?没错,这正是它的核心定位。作为一个在Java生态里摸…...