动态内存管理(c++方向必看)

发布时间:2026/10/2 17:38:46

动态内存管理(c++方向必看) 引言学 C 的时候我一度觉得malloc挺多余——数组不是挺好用吗直到写了个小练习让用户输入一串数字再排序。写完发现卡住了数组长度写多少写 10用户输入 11 个就崩写 1000又嫌浪费万一输入 1001 个呢。关键是到底有几个数字我写代码的时候根本不知道得等程序跑起来才清楚。malloc解决的就是这个运行时再决定要多少内存代价是这块内存从此归你管——用完得free不能越界free完也不能再用。动态内存管理也是学好数据结构的前置知识点。这篇就来讲清楚这几件事。目录1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.开辟成功和失败的案例3.calloc和realloc3.1calloc3.3realloc1.为什么要有动态内存分配我们已经掌握的的内存开辟方式有int val 20; //在栈空间上开辟四个字节 char arr[10] { 0 }; //在栈空间上开辟10个字节的连续空间但是上述开辟空间的方式有两个特点:1.空间开辟大小是固定的2.数组在申明的时候必须指定数组的长度数组空间⼀旦确定了大小不能调整但是对于空间的需求不仅仅是上述的情况。有时候我们需要的空间大小在程序运⾏的时候才能知 道那数组的编译时开辟空间的方式就不能满足了。C语言引入了动态内存开辟让程序自己可以申请和释放空间就比较灵活了。2.malloc和free2.1mallocC语言为我们提供了一个动态内存开辟的函数void* malloc (size_t size);功能向内存的堆区申请一块连续可用的空间并返回指向这块空间的起始地址。1. 如果开辟成功则返回这块空间的起始地址。2.如果开辟失败则返回⼀个 • 返回值的类型是 NULL 指针因此malloc的返回值⼀定要做检查。3.返回值的类型是void* 所以malloc函数并不知道开辟空间的类型具体在使⽤的时候使⽤者自己来决定。4. 如果参数 size 为0malloc的行为是标准是未定义的取决于编译器2.2freeC语言提供了一个用于做动态内存的释放和回收的函数freevoid free (void* ptr);free函数用来释放动态开辟的内存就像一个图书馆不能一直借书但是从来不还书这样会出问题的malloc和free都声明在stdilb.h头文件中。如果参数ptr指向的空间不是动态开辟的那函数free的行为是未定义的。如果参数ptr是NULL指针则函数什么都不需要做。3.开辟成功和失败的案例#includestdio.h #includestdlib.h int main() { int* p (int*)malloc(20);//在堆区上申请20个字节的空间 if (p NULL) { perror(use malloc); return 1; } //使用空间 int i 0; for (i 0; i 5; i) { p[i] i 1; } //释放内存 free(p); return 0; }当程序指向完free这一行我们使用malloc开辟的内存就被回收掉了但是当我们把地址还掉之后p还指向原来的地址此时的p就是野指针这个时候给他一个空指针可以了就像给野狗套上铁链子。当我们把编译器环境从x64改成x86并且在malloc中输入特别大的数字动态内存的开辟就有可能失败错误信通过perror函数打印出来。3.calloc和realloc3.1callocC语言还提供了一个函数calloccalloc也能用来动态内存分配void* calloc (size_t num, size_t size);函数的功能是为num个⼤⼩为size的元素开辟⼀块空间并且把空间的每个字节初始化为0与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全 0。int main() { int* p (int*)calloc(5, sizeof(int)); if (p NULL) { perror(use malloc); return 1; } //使用空间 int i 0; for (i 0; i 5; i) { p[i] i 1; } //释放内存 free(p); p NULL; return 0; }malloc和calloc仅仅在初始化上有区别其他方面是没有区别的。3.3reallocrealloc的出现使得动态内存管理更加灵活有时我们会觉得内存过小不够用有时候内存过大又会产生浪费为了更合理的使用内存我们会对内存的大小做灵活调整realloc就可以做到对动态开辟内存大小的调整。void* realloc (void* ptr, size_t size);功能重新调整之前分配的内存块的大小它可以在不丢失原有数据的情况下扩大或缩小动态分配的内存块。参数ptr是要调整的内存空间的起始地址如果ptr是NULl指针realloc函数的功能类似于malloc函数。size调整之后新大小单位是字节。返回值成功:返回一个指向重新分配的内存块的void*类型指针。这个指针可能与原来的指针不同。失败:如果内存重新分配失败返回 NULL并且原来的内存块保持不变。int main() { int* p (int*)calloc(5, sizeof(int)); if (p NULL) { perror(use malloc); return 1; } //使用空间 int i 0; for (i 0; i 5; i) { p[i] i 1; } //希望空间能放10个整形 int* ptr realloc(p, 10 * sizeof(int)); if (ptr NULL) { perror(use realloc); return 1; } else { p ptr;//继续使用p来维护空间 } //继续使用 for (i 5; i 10; i) { p[i] i 1; } free(p); p NULL; return 0; }注意这里不能直接使用p来接收realloc的结果因为p本身就指向了一块空间如果realloc开辟失败那么p直接被置为NULL了所以我们可以先创建一个ptr来接收待确认空间开辟成功再让p接收。使用realloc调整空间存在两种情况1.原有的空间后有足够大的空间此时拓展内存就直接在原有内存之后直接追加内存原来空间的数据不发生变化2.当原有空间之后没有足够多的空间时扩展的方法是在堆空间另找一个合适大小连续的空间来使用并返回新的地址原来空间中存放的数据会复制过来随后旧空间就释放掉了。旧空间”我免费了“free因为篇幅原因动态内存暂时就写到这下一篇会把常见的动态内存错误一些经典的面试题柔性数组等知识点讲清楚。再次感谢各位码友的观看祝我们都能实现自己的理想
延伸阅读

更多相关文章

2026/10/2 17:33:46

让模型多想几遍就能变聪明吗?这次训练方式说明未必

你可能没意识到,现在训练大模型做数学题、写代码,靠的是一种叫强化学习的方法。简单说,就是让模型自己生成答案,做对了就奖励,做错了就不奖励,反复调整,模型就越来越会做题。这套方法有个响亮的名字,叫RLVR。可验证奖励强化学习:一种训练方法…

2026/10/2 17:33:46

软件工程实践第一次作业:前后端分离计算器系统

软件工程实践第一次作业:前后端分离计算器系统 Course for This Assignment软件工程实践Assignment Requirements前后端分离计算器系统Objectives of This Assignment掌握前后端分离架构、接口开发、数据库持久化、系统设计与博客文档撰写姓名 / 学号吴正杨 / 2412…

2026/10/2 17:33:46

卤牛头生产厂家靠谱商家测评排名:不踩坑的源头工厂实力分析

卤牛头行业入门科普:选源头工厂前必须理清的核心逻辑作为日常餐饮、熟食门店的高频选品,卤牛头凭借厚实的肉感、浓郁的卤香,成为很多线下商户的核心引品。不过很多新手商家在寻找供货源头时容易陷入认知盲区:卤牛头的品质核心取决…

2026/10/2 18:38:49

Python旅游网站开发:Flask+MySQL管理后台源码实战

简介:一套基于Flask和MySQL的旅游旅行网站及管理后台项目源码,面向计算机专业毕业设计、课程设计或希望入门Python Web开发的读者。项目围绕旅游景点展示、线路推荐、用户登录注册、后台数据管理等典型业务展开,结构清晰,适合作为…

2026/10/2 18:38:49

Redis接入AI能力实战:向量检索与语义缓存深度解析

1. 从一条更新日志说起:Redis 接入 AI 到底意味着什么 前几天刷技术社区,看到一条消息说 Redis 正式接入了 AI 能力。第一反应是:这又是哪个营销号在搞标题党?Redis 一个内存数据库,跟 AI 能扯上什么关系?但…

2026/10/2 18:38:49

PostgreSQL 12.0源码编译安装实战:CentOS 7.9从依赖到systemd管理

1. 部署前想清楚的三件事:版本、方式、目录PostgreSQL 12.0是2019年10月发布的版本,放在今天看并不算新,最新社区版已经迭代到17甚至更高。但现实中需要部署它的项目一点不少:很多国产化数据库改造项目、存量业务系统的迁移验收、…

2026/10/2 18:38:49

Windows下用WSL2部署OpenClaw个人AI助理的完整指南

说实话,第一次在Windows上跑OpenClaw的时候,我踩的坑比想象中多得多。这个项目本身定位就是“个人AI助理”,能把聊天平台、本地模型、笔记工具串在一起,让它替你操作浏览器、查资料、写总结,听起来很爽,但你…

2026/10/2 18:38:49

XShell安装配置与SSH远程连接实战指南

1. 为什么选XShell?它真不是“又一个SSH工具”,而是终端操作的效率分水岭 XShell这个名字,在运维、开发、测试甚至高校实验室里,几乎等同于“稳定”“可靠”“不折腾”。它不是那种装完就闪退、连三次断两次、中文乱码到怀疑显示器…

2026/10/2 18:33:49

Hudi + Hive 增量数据处理全攻略:从同步机制到小文件优化

做网约车大数据项目那段时间,每天几十亿条订单、轨迹、支付流水往数据平台涌。团队最头疼的并不是数据量大,而是“变化”本身:订单状态不停更新、司机位置持续漂移、部分记录还要回滚删除。如果还是按离线思路每天全量重跑,计算资…

2026/10/2 8:16:46

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/10/2 18:20:53

如何划分训练/验证集: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/10/1 10:48:55

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

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

2026/10/2 0:02:57

PWN入门:从栈溢出原理到ROP链实战

1. 这不是“学PWN”,是重新理解你每天敲的每一行C代码我第一次在CTF赛场上写出能控制程序流的exp时,手抖得连gdb的c命令都输错三次。那道题只有23行C代码,一个gets()调用,一个printf(),一个return——它甚至没开NX&…

2026/10/2 0:02:57

Windows下cudaMallocHost显存占用之谜:WDDM与TCC模式差异及优化方案

1. 一个反直觉的显存占用现象第一次在 Windows 上看到cudaMallocHost把显存吃掉的时候,我的反应是打开任务管理器反复确认了三遍。明明调用的是主机端锁页内存分配,按 CUDA 文档的说法,这块内存应该落在系统 RAM 里,跟 GPU 的显存…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑