C/C++经典面试题:malloc vs new

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既可以分配空间又可以初始化。

malloc如何开源节流?

猜你喜欢

转载自blog.csdn.net/GameStrategist/article/details/107452735