《C/C++学习指南》语法篇—笔记 (九、动态分配内存--malloc_free
- 内存管理器 MM
- 非常重要:堆 (MM管理的内存区域)
- malloc函数
- free函数
- 注:
- 特点
问题:数组一块连续内存,长度 (常量)必须在代码里固定。
内存管理器 MM
MM,Memory Manager :系统中存在一个内存管理器,负责管理一堆闲置的内存。
MM提供服务:应用程序可以想MM申请(借出)一块指定大小的内存,用完之后再释放(还回)。
void* ptr = malloc(1024); //申请,从MM借出内存
free(ptr); //释放,还回MM
注:
- MM是个系统级的东西,所有的应用程序都向同一个MM申请内存。
- 借出:在内存被借出时,MM只是把它管理的内存标记(首地址,长度)了一下,表示该段内存已被占用。
- 只要malloc,MM都会借出,不手动free,MM不会要求free,所以用户程序应自觉及时free。
非常重要:堆 (MM管理的内存区域)
MM管理的内存区域称为“堆”,Heap,相当于一个仓库。当应用程序要malloc时,就从仓库里登记借出。当free时,就将这一块内存放回仓库。
malloc函数
void* malloc(int size)$ 参数size:指定要申请的内存空间的大小$ 返回值:void* ,指向这一块内存地址
MM不管你拿这块内存储存何种数据,所以返回void*
,在使用malloc时,要把返回值转换成目标类型。如要申请一块空间存放100个int型对象,则↓,这块内存和数组没有本质区别,用法完全相同,数组本质就是一块连续内存。
int size = 100*sizeof(int);
int* p = (int*)malloc(size);
free函数
void free(void* ptr)$ ptr:先前malloc返回的内存地址$ 返回值:void* ,指向这一块内存地址
注:
- 不是malloc的指针,不可以free
- malloc的内存必须及时free
- free必须free首地址
- malloc的返回值需要检测 是不是返回NULL,没有内存了返回NULL。
- free之后,该指针不能使用
- malloc得到的内存可以在任意位置释放
特点
C/C++特点,使用指针直接操作内存。灵活高效但是主要逻辑缜密,不然容易崩溃