首页 > 代码库 > 从内部入手,浅谈malloc和new的区别
从内部入手,浅谈malloc和new的区别
想要理解一样事物,就要先用自己的语言去描述一件事物。在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置链表"。然后在这块空闲空间进行划分,划出用户需要的与用户不需要的。然后把用户需要的给用户,不需要的返还给"闲置链表"。而用户使用free释放时候也是扔回去的过程。但是这时候的空闲空间是间断的片段,malloc函数就需要去整理整合这些片段,若空间达不到用户需要,malloc就会返还NULL指针,告诉用户空间不足。这就是为什么malloc需要检验返还值了。
那么new和malloc的工作机制到底有什么不同呢= =?通过查找,我翻到了new的源码
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{ // try to allocate size bytes
void *p;
while ((p = malloc(size)) == 0)
if (_callnewh(size) == 0)
{ // report no memory
_THROW_NCEE(_XSTD bad_alloc, );
}
return (p);
}
我们可以看到new的实现方法也是通过malloc函数来实现的,但是它们之间有很多不同之处。通过对malloc的源码进行查看
void *malloc (unsigned int size)
{
char *caddr;
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) + 3) & (~3));
return caddr;
}
可以粗略的看出,malloc函数是不会去计算用户所需要的内存空间,需要用户自己去计算自己需要的空间大小,例如在数组中,malloc是需要用户自己给出计算后的大小,而new会额外储存数组大小,不需要用户再次进行计算。(参数表中的size_t,通常我们用sizeof(XXX)操作,这个操作所得到的结果就是size_t类型)。
也就是说,new 基于 malloc,却又高于malloc,是它的一个提升版本。
在返回值上面,new和malloc函数的区别只是在于,new是抛错,要判断是否分配成功应该用异常捕获的机制,而malloc函数在内存不够时直接返还NULL。
由于个人能力有限,只能进行浅层次的对比。但对于这个东西,我现在的看法也只有这样了。
从内部入手,浅谈malloc和new的区别