malloc 与 free
函数原型
void *malloc( size_t size ); // 参数size为需要申请内存空间的数量
void free( void* memblock ); // 参数memblock为需要释放内存的指针
malloc 如何实现?
- 简单介绍
maloc全称是memory allocation,中文叫动态内存分配,
用于申请一块连续的指定大小的内存块区域;
malloc是标准库函数,在stdlib.h头文件中;
成功,函数的返回值是分配区域的起始地址,或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置。
失败,返回空指针NULL。 - 代码实现
要进一步的探索malloc,要么只有自己查阅源码,要么自己编写功能类似的源码;
而我选择了参考其他博主的方案,下面附上链接,相信你也会豁然开朗
malloc的代码实现链接
free 如何知道要释放多少内存空间?
初学C语言时,笔者以为malloc是程序员自己计算size并按需申请大小,只会用不知其深意。
如下链接的博主给出了一个推导的答案
malloc申请后测试内存链接
测试表明首地址前的16个字节处存放了申请内存空间的数值
在测试后该博主又抛出了新的问题,笔者也很是感兴趣;
这种与sleep函数的实际延迟时间大于理想值是有区别的;
在malloc百度百科介绍工作机制中,有讲道:
调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。
然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。
答案显而易见了:系统在分配内存时除了分配指定的内存空间外,还有分配用于保存内存空间大小等信息。所以内存释放时不再需要再指定释放多大的内存空间,只需要指定该块内存空间的首地址即可
malloc VS new
在使用上,malloc 和 new 至少有两个不同:
-
1.new 返回指定类型的指针,并且可以自动计算所需要大小。
而 malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。 -
2.不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化;
所以得到的一片新内存中,其值将是随机的。
除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致
简化答案
1.malloc是按照字节为单位分配,new按照数据类型为单位分配空间;
2.malloc是函数,new是运算符;
3.malloc只分配空间,不初始化,new既可以分配空间又可以初始化。