首页 > 代码库 > 从内部入手,浅谈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的区别