一、为什么存在动态内存管理
在之前数组的学习过程中,我们知道,数组是在编译时开辟空间,但是程序运行之后所需要的空间的大小我们是不可知的,因此我们需要用到动态内存开辟,进行动态内存管理是为了尽量避免内存安全问题的出现。
二、动态内存函数的介绍
1、malloc
函数的简述
void* malloc (size_t size)
函数的返回值为void*,函数的参数为无符号整形即将要开辟空间的大小(单位是字节)
当用malloc函数进行动态内存开辟空间成功时,返回其所开辟空间的首地址;
当用malloc函数进行动态内存开辟空间失败时,返回NULL
注意事项
进行malloc开辟空间后进行判断
使用malloc函数进行开辟的空间,当这片空间使用完成后,一定要记得用free函数释放掉
释放掉后将释放掉的指针置空
函数的声明:#include<stdlib.h>
函数的使用
养成使用malloc函数开辟空间进行判断的习惯,增强代码的健壮性
2、free
函数的简述
void free(void*ptr)
将malloc函数开辟的内存进行释放,释放是指将将malloc函数开辟的空间还给操作系统,防止内存泄漏
思考:free函数是如何做到精准释放的
当我们使用malloc开辟40个字节的空间时,实际开辟的是44个字节,其中前四个字节存放的是一个整形变量,用于记录开辟的大小
3、calloc
函数简述
void*calloc(int num,size_t size)
向内存中申请num个,大小为size个的空间然后初始化为0
注意事项:
使用完calloc开辟后的空间也需要用free进行释放
然后再将其置空
函数的使用
4、realloc
函数的简述
void * realloc ( void*ptr,size_t size )
relloc函数用于空间的动态调整,将已经开辟好由 ptr 指向的空间进行扩容到size个字节,用于malloc进行开辟的空间过小不够用时及时对空间进行调整
理解易错点:是扩容到size个字节,而不是扩容size个字节,一字之差,天壤之别
函数的使用
realloc开辟空间的两种情况
情况一:malloc 或者 calloc 开辟的空间后紧接着的空间,有足够的空间让realloc函数进行扩容
内存扩容的机理
直接在紧接着的内存空间进行扩容
情况二:malloc 或者 calloc 开辟的空间后的一段空间的空间,不足够的空间让realloc函数进行扩容
内存扩容的机理
①在内存中找到一片足够大的空间进行开辟
②将要进行扩容空间的内容拷贝过来
③将原地址处的内存进行释放
④返回新开辟内存位置的首地址
三、常见的内存错误
①对空指针进行解引用
产生原因:一般为没有对malloc开辟的空间进行判断②对动态开辟的空间进行越界访问
③对于非动态开辟的空间进行free释放
④用 free 释放 malloc 开辟的空间的一部分
⑤多次使用free释放同一片空间
解决办法:养成良好习惯,将free释放后的内存进行置空⑥内存泄漏
产生原因:malloc开辟的内存空间使用完忘记释放,导致这片空间在内存中存在,但是无法找到并使用,造成内存泄漏