无操作系统单片机堆内存管理:malloc地址跟踪及free后内存复用问题
代码示例中的内存复用问题
先看代码:
char *x; char *y; char *z; x=(char*)malloc(10); y=(char*)malloc(10); free(x); z=(char*)malloc(10);
结论:只要malloc/free实现支持内存回收(即free有实际作用),后续malloc给z分配时会复用x释放的内存块。
原因:free(x)执行后,x指向的10字节内存会被标记为空闲。调用malloc(10)时,内存分配器会优先扫描空闲块列表,找到这个大小完全匹配的空闲块,直接重新分配给z,不会去堆末尾申请新空间。
只有使用“只进不退”的极简malloc实现(free是空操作)时,x的内存才不会被复用,z会在y之后的堆地址分配,但这种实现基本不会用于需要回收内存的场景。
内容的提问来源于stack exchange,提问作者hal
相关产品推荐
相关产品推荐

