目录
一.内存管理
1.内存管理的意义
不同区域存放的数据,赋予不同的生命周期,带来了更大的灵活编程;
2.四个内存区间
⭕代码区: 存放函数体的二进制代码,由操作系统进行管理(cpu执行的机器指令,共享只读);
⭕全局区(全局静态区): 存放全局变量和静态变量以及常量(包含const);
⭕栈区: 由编译器自动分配释放,存放函教的参数值,局部变量等;
⭕堆区: 由程序员分配和释放,若程序员不释放程序结束时由操作系统回收;
3.代码示例:
此时data 为已经初始化过的数据和字符串常量,共有280字节
bss为为初始化过的数据有8字节
接下来把a初始化,就可以看到已经初始化过的data数据就是284字节了,未初始化bss数据就变成了4字节
二.动态内存的申请和释放
1.动态内存分配
申请空间
#include <stdlib.h>
void *malloc(size_t size);
参数:所需申请空间的大小
返回值:成功 申请空间的首地址
失败 NULL
2.动态内存的释放
释放空间
#include <stdlib.h>
void free(void *ptr);
参数:malloc的地址
返回值:无
3.代码示例
⭕malloc返回申请成功的地址的首地址,然后把这个地址给到a;
动态申请空间要手动释放;
⭕ 申请到的内存是一块连续的内存空间,可能实际的空间比申请到的空间大,若申请失败会返回NULL,尽量在代码中加入申请失败的提醒;
⭕申请的空间不能多次释放;
⭕使用free函数释放空间时必须提供释放空间的首地址,且malloc和free配对使用,避免内存泄漏
三.内存泄漏和溢出
内存泄漏(memory leak):
是指申请的内存空间使用完毕之后未回收。 一次内存泄露危害可以忽略,但若一直泄漏,无论有多少内存,迟早都会被占用光,最终导致程序crash。(因此,开发中我们要尽量避免内存泄漏的出现)
内存溢出(out of memory):
是指程序在申请内存时,没有足够的内存空间供其使用。 通俗理解就是内存不够用了,通常在运行大型应用或游戏时,应用或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。最终导致机器重启或者程序crash。