在C语言中,要进行动态内存的开辟就需要使用到malloc函数,在C++中使用的new关键字的基层也是调用了malloc函数,可见malloc函数的重要性,这个就浅析一下malloc的实现过程。
本文的测试环境是win10+vs2015。
首先先看看malloc函数怎么去调用
// malloc函数原型
// void *malloc( size_t size );//(MSDN中的定义)
type* temp=(type*)malloc(sizeof(type*n));
// type表示数据类型;
// n表示需要创建几个该类型的成员
// sizeof(type*n)表示成员所占空间
有函数原型可知
- malloc函数返回值是void*,所以实际上是用的时候都将其进行了强制转换
- malloc函数的传参是size_t类型的,在vs2015中的定义是
typedef unsigned int size_t;
表示它是无符号整数类型
sizeof关键返回值是size_t,所以不会冲突
重点内容
malloc函数申请空间的操作步骤:
- 对堆进行加锁
- 在正式申请空间之前,对堆进行校验
- 检测申请内存块的类型
- 检测内存空间是否充足,不够设置错误信息,返回NULL,否则进行5
- 检测块的类型
- 计算本次所要申请的内存块的总字节数
- 按照计算的总字节数申请内存,底层真正向堆申请空间的是HeapAlloc函数
- 检测是否申请成功,如果申请失败设置错误信息,返回NULL,否则执行9
- 修改请求次数和目前申请的总字节数
- 将新申请的内存块的新节点头插到双向链表中
- 给该结点对应的结构体赋值
- 填充空间
- 获取申请内存块中存放有效数据的真正位置
- 对堆进行解锁
- 返回有效数据区域的地址
malloc函数的具体实现过程
// 该段代码拷贝于vs2015的malloc.h
// malloc.h
#pragma once
#define _INC_MALLOC
#include <corecrt.h>
#include <corecrt_malloc.h>
_CRT_BEGIN_C_HEADER
// 查看是win32还是win64的平台
#ifdef _WIN64
#