当前位置:网站首页>C语言中堆内存介绍和管理
C语言中堆内存介绍和管理
2022-07-27 05:03:00 【我真不是二次元】
C语言的堆内存介绍和管理
1.什么是堆内存
堆内存是进程的一个内存段(text\data\bss\heap\stack),程序员手动管理,优点足够大,缺点使用麻烦
2.为什么要使用堆内存
1、随着程序的复杂,数据量变多
2、其他内存段的申请释放不受控制,堆内存的申请释放受控制,可以适时地节约内存
3.如何使用堆内存
注意:C语言中没有控制堆内存的语句,只能使用C标准库中的函数
头文件:#include <stdlib.h>
1.void *malloc(size_t size);
功能:从堆内存中申请size个字节的内存,申请到的内存中数据的值不确定
返回值:成功返回申请到的连续内存的首地址,失败返回NULL
2.void free(viod * ptr);
功能:释放一块堆内存
ptr:要释放的堆内存的首地址
注意:free释放只是使用权限,数据不会全部清理
注意:不能连续释放,但是可以释放NULL
3.void *calloc(size_t nmemb,size_t size);
功能:从堆内存申请nmemb块,每块size字节大小的内存
返回值:成功返回申请到的连续内存的首地址,失败返回NULL
注意:calloc申请到的内存会被初始化为0,速度比malloc慢
short* p = calloc(10,4) == malloc(40)
4.void *realloc(void *ptr,size_t size);
功能:改变已有的堆内存的大小,size表示调整后的大小,在原有的基础上调大调小
返回值:调整后内存块的新的首地址,一定要重新接受返回值,可能不是在原位置进行调整
如果无法在原位置:
1、申请一块新的符合大小的内存
2、拷贝原内存中的数据
3、释放原内存,返回新内存首地址
4.malloc的内存管理机制
1、当首次向malloc申请内存,malloc会向操作系统申请内存,操作系统会直接分配33页(1页=4096字节)内存交给malloc管理,但是并不意味着可以越界访问,因为malloc可能会把其他的内存分配给"其他人",这样就会产生脏数据
2、每个内存块之间会有空隙(4~12字节),一部分空隙是为了内存对齐,其中一定有4字节记录了malloc的维护信息,这些维护信息决定了下一次malloc分配内存的位置,如果破坏了维护信息,会影响下一次malloc或者free的过程
5.使用堆内存需要注意的问题
1.内存泄漏:
内存无法再使用,也无法被释放,而需要再次使用时只能重新申请内存,然后继续重复以上过程,日积月累后可用的内存越来越少
注意:一旦进程结束属于该进程的所有资源都会被操作系统回收
如何尽量地避免内存泄漏:
谁申请谁释放,谁知道该释放谁释放
如何判断、定位内存泄漏:
1、查看内存使用情况
win 任务管理器
Linux ps -aux命令
2、借助代码分析工具 mtrace 检查malloc和free是否成对出现
3、封装malloc、free,记录申请、释放的信息到日志文件中
2.内存碎片:
已经释放了但无法继续使用的内存叫做内存碎片,由于申请和释放的时间不协调导致的,无法完全避免只能尽量减少
如何减少内存碎片:
1、尽量使用栈内存
2、不要频繁地申请、释放内存
3、尽量申请大块的内存自己管理
6.内存清理函数
1.#include <strings.h>void bzero(void *s,size_t n);
功能:把一块内存清理为0
s:内存块的首地址
n:内存块的字节数
2. #include <string.h>void *memset*(void *s,int c,size_t n);
功能:把内存块按字节设置为c
s:内存块的首地址
c:想要设置的ASCII值
n:内存块的字节数
返回值:成功设置后的内存首地址
堆内存定义二维数组
指针数组
定义n行,m列二维数组
类型* arr[n];
for(int i=0;i<n;i++)
{
arr[i]=malloc(m*sizeof(类型));
}
注意:每一行的m值可以不同,这种方式可以定义不规则的二维数组
缺点:申请麻烦、容易产生内存碎片
优点:可以不规则、对内存要求低
数组指针
类型 (*arrp)[n]=malloc(sizeof(类型)*n*m)
申请m行n列的二维数组
缺点:对内存要求高,可能申请失败
优点:申请简单
注意:所谓的多维数组其实都是用一维数组模拟
边栏推荐
- 李宏毅机器学习组队学习打卡活动day02---回归
- B1031 check ID card
- Li Hongyi machine learning team learning punch in activity day01 --- introduction to machine learning
- 用户的管理-限制
- redis事务
- 如何快速有效解决数据库连接失败问题
- mysql 取消外键关联约束
- Database design - relational data theory (ultra detailed)
- C WPF uses listbox to implement ruler control
- JWT认证及登录功能实现,退出登录
猜你喜欢

2021 Niuke multi school training camp 5 (question b)

B1021 single digit statistics

笔记系列之docker安装Postgresql 14

C WPF uses listbox to implement ruler control

用户的管理-限制

Database design - relational data theory (ultra detailed)

Pytorch data type and numpy data are mutually transformed

Alphabetic order problem

Flask框架创建项目初期总结

BIO、NIO、AIO区别
随机推荐
B1021 single digit statistics
322 coin change of leetcode
Pytorch data type and numpy data are mutually transformed
JDBC API details
Redis cluster
Student management system
弹球小游戏
redis锁
Looking at the PK of alphago and Li Shishi from a deep perspective
Makefile is easy to understand and explain
如何快速上手强化学习?
通用视图,DRF视图回顾
LocalDateTime和ZonedDateTime
Message reliability processing
ERP system brand
Redis publish subscribe mode
李宏毅机器学习组队学习打卡活动day03---误差和梯度下降
torch中乘法整理,*&torch.mul()&torch.mv()&torch.mm()&torch.dot()&@&torch.mutmal()
Find the number of combinations (the strongest optimization)
用户管理-分页