从内部入手,浅谈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 ...
随机推荐
- linux ps 按进程消耗内存资源大小排序
linux ps 关于sort的解释 --sort spec specify sorting order. Sorting syntax is [+|-]key[,[+|-]key[,...]] Ch ...
- 【EMV L2】终端验证结果(Terminal Verification Results,TVR)
终端验证结果,Terminal Verification Results(TVR),Tag95,5bytes: 记录交易过程中,数据认证.处理限制.持卡人验证.终端风险管理.行为分析以及联机处理的结果 ...
- spring源码1:基本概念
一.预习 1.如何用spring?零配置(注解)或少配置,与应用无侵入性一起运行,与主流框架无缝集成. 2.spring 是什么?spring 是 java 企业应用级框架,目的是为了简化开发:主要体 ...
- python 9
一.常识 在制作统计表时,要创建一个listname_list,来存放列明,这样以后进行列明删减的更新时,比较方便. 二.函数的初识 代码遇到def就跳过,把函数内容放到内存中,遇到函数名再来执行函数 ...
- python开发流程及项目目录规范
# 项目开发流程 1.调研 2.需求分析 ---产品经理 3.任务分配 ---项目经理 4.写项目demo ---项目经理.架构师.程序猿 5.架构分析 ---项目经理.架构师 6.编 ...
- es6 this指向
在非箭头函数中,谁调用的函数,this指向就是谁: var obj={ fn:function(){ console.log(this); } } obj.fn();//object 如果this出现 ...
- MySQL1-安装
MySQL 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据 ...
- Int和String互转的方法
Java 中int.String的类型转换 int -> String int i=12345;String s="";第一种方法:s=i+"";第二 ...
- CentOS7查看和关闭防火墙
CentOS 7.0默认使用的是firewall作为防火墙 1.查看防火墙状态 firewall-cmd --state2.停止firewall systemctl stop firewalld.se ...
- Python(四) —— 函数
什么是函数? 把一堆代码放一起就叫函数 函数用来干什么? 不复写代码,提高代码重复利用程度 怎么定义以及调用函数: def fun1(): #定义函数 print('这是一个函数') #函数体,里面什 ...