从内部入手,浅谈malloc和new的区别
想要理解一样事物,就要先用自己的语言去描述一件事物。在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置链表"。然后在这块空闲空间进行划分,划出用户需要的与用户不需要的。然后把用户需要的给用户,不需要的返还给"闲置链表"。而用户使用free释放时候也是扔回去的过程。但是这时候的空闲空间是间断的片段,malloc函数就需要去整理整合这些片段,若空间达不到用户需要,malloc就会返还NULL指针,告诉用户空间不足。这就是为什么malloc需要检验返还值了。
那么new和malloc的工作机制到底有什么不同呢= =?通过查找,我翻到了new的源码
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // 尝试申请内存空间
void *p; //这个指针用于指向获取到的空间,且返回该指针给调用方,且设置为void*是为了能够指向任意格式
while ((p = malloc(size)) == ) //利用malloc函数调用来申请内存空间,得到一个闲置链表
if (_callnewh(size) == )
{ // 抛出没内存的信息
_THROW_NCEE(_XSTD bad_alloc, );
} return (p);
}
我们可以看到new的实现方法也是通过malloc函数来实现的,但是它们之间有很多不同之处。通过对malloc的源码进行查看
void *malloc (unsigned int size)
{
char *caddr; //虽然unsigned char* caddr是编译器认可的最小内存申明,但这里我们使用 char * if (!malloc_ptr)
return NULL;
if ((malloc_ptr + size + sizeof(int)) > malloc_top) {
prom_printf("malloc failed\n");
return NULL;
}
*(int *)malloc_ptr = size;
caddr = malloc_ptr + sizeof(int);
malloc_ptr += size + sizeof(int);
last_alloc = caddr;
malloc_ptr = (char *) ((((unsigned int) malloc_ptr) + ) & (~));
return caddr;
}
可以粗略的看出,malloc函数是不会去计算用户所需要的内存空间,需要用户自己去计算自己需要的空间大小,例如在数组中,malloc是需要用户自己给出计算后的大小,而new会额外储存数组大小,不需要用户再次进行计算。(参数表中的size_t,通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型)。
也就是说,new 基于 malloc,却又高于malloc,是它的一个提升版本。
在返回值上面,new和malloc函数的区别只是在于,new是抛错,要判断是否分配成功应该用异常捕获的机制,而malloc函数在内存不够时直接返还NULL。
由于个人能力有限,只能进行浅层次的对比。
从内部入手,浅谈malloc和new的区别的更多相关文章
- 浅谈 unix, linux, ios, android 区别和联系
浅谈 unix, linux, ios, android 区别和联系 网上的答案并不是很好,便从网上整理的相对专业的问答,本人很菜,大佬勿喷 UNIX 和 Linux UNIX 操作系统(尤尼斯) ...
- 浅谈cookie 和session 的区别
具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cooki ...
- 浅谈malloc/free和new/delete 的区别
malloc和new的区别 malloc是库函数,需要包头文件才能成功运行编译:new是操作符(C++中的关键字),需要在C++的环境下使用. malloc既可以在C语言中使用也可以在C++中使用,n ...
- 浅谈Log4j和Log4j2的区别
相信很多程序猿朋友对log4j都很熟悉,log4j可以说是陪伴了绝大多数的朋友开启的编程.我不知道log4j之前是用什么,至少在我的生涯中,是log4j带我开启的日志时代. log4j是Apache的 ...
- 浅谈malloc()与free()
malloc()与free() l 函数原型 malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指 ...
- 浅谈malloc()和free()工作原理
编程之路刚刚开始,错误难免,希望大家能够指出. malloc()和free()是我经常需要用到的函数,一般情况下,C程序使用malloc()在堆上分配内存,free()释放内存,两者的参数和返回值就 ...
- 浅谈Swift和OC的区别
前言 转眼Swift3都出来快一年了,从OC到Swift也经历了很多,所以对两者的一些使用区别也总结了一点,暂且记录下,权当自己的一个笔记. 当然其中一些区别可能大家都有耳闻,所以这里也会结合自身的一 ...
- 浅谈angular2与angularJS的区别
简介 大家好,今天给大家介绍一下angular,相信做过前端的小伙伴们都知道angular的大名,angularJS自2012年发布起就受到了大家的广泛关注.他首次提出了双向绑定概念让所有人都耳目一新 ...
- 浅谈Comparable与Comparator的区别
平时进行自定义排序一直使用实现Comparable接口,一段时间后操作的时候居然发现有了个Comparator接口 上网差了些资料,总结笔记一下. 基本原理就是比较,底层是二叉树 比如是3,6,5,1 ...
随机推荐
- 学习Mathematica
[转载请注明出处]http://www.cnblogs.com/mashiqi 2017/12/07 0.杂: Mathematica的自带函数的首字母一定是大写的,参数输入要用中括号[],而不是圆括 ...
- ffmpeg推送直播流的技术进展
首先安装好NGINX并打开服务 然后安装好ffmpeg 然后参考:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=2879051 ...
- AI之旅(5):正则化与牛顿方法
前置知识 导数,矩阵的逆 知识地图 正则化是通过为参数支付代价的方式,降低系统复杂度的方法.牛顿方法是一种适用于逻辑回归的求解方法,相比梯度上升法具有迭代次数少,消耗资源多的特点. 过拟合与欠 ...
- 数据t转换
#!/usr/bin/perl use strict; use warnings; open my $fh,"a.out"; open OUT,">a_t.o ...
- org.springframework.orm.hibernate3.HibernateSystemException:
org.springframework.orm.hibernate3.HibernateSystemException: The database returned no natively gener ...
- Cartographer安装
安装过程: 官方安装教程: https://google-cartographer-ros.readthedocs.io/en/latest/index.html # Install wstool a ...
- 服务端渲染时无法获得环境变量的值,一直是undefined
1.服务端渲染时无法获得环境变量的值,一直是undefined 2.ngnix做代理以后无法无法获取node设置的cookie
- 图的深度优先遍历(DFS)—递归算法
实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...
- javascript中使用"<"符号,比较大小的是字符串或对象时正确的处理方法
<![CDATA[ var items=document.getElementsByTagName("li"); for(var i=0;i<items.length; ...
- vue---条件与循环语句
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...