堆内存管理:
C语言中没有管理堆内存的语句,只能使用标准库中的函数
#include <stdlib.c>
void *malloc(size_t size);
功能:从堆内存申请size个字节大小的内存块,里面的内容不确定
返回值:内存块的首地址
【注】:void*在C++编译中不能自动转换成其他类型的指针,如果想让代码在C++中兼容要强制类型转换
int* p = (int*)malloc(4);
free(void *ptr)
功能:释放一块内存
ptr:内存块的首地址
【注】:free可以释放空指针,但是别的内存块不能连续释放
常见面试题:
1、堆内存和栈内存的区别
定义 大小 使用 安全性 优缺点
栈内存、堆内存都是进程的一个内存段栈内存存放的是局部变量,由操作系统自动分配和释放,
2、堆内存越界的后果
超过了33页产生段错误
破坏了malloc的维护信息,再次使用malloc/free会出错
脏数据
3、什么是内存泄漏,如何定位内存泄漏
由于粗心、业务逻辑出错导致使用完毕的内存没有释放,当再次需要时只能重新申请,又没释放,日积月累能使用的内存就 越来越少,系统就会越来越慢甚至奔溃
1、Windows查看任务管理器,Linux使用ps -aux,或者通过GDB查看内存使用情况
2、使用代码工具,分析代码(mtrace)
3、封装malloc、free,记录申请、释放内存的过程到日志中
4、什么是内存碎片,如何减少内存碎片
已经释放但也无法再次使用的内存块就叫内存碎片,它是由于申请释放的时间、大小不协调导致的
1、尽量使用栈内存
2、不要频繁申请释放内存
3、尽量申请大内存,自己管理