zoukankan      html  css  js  c++  java
  • 从内部入手,浅谈malloc和new的区别

    想要理解一样事物,就要先用自己的语言去描述一件事物。在我查阅资料后,发现malloc函数简单说来就是空闲内存空间收集器,并把空闲空间关联起来,用术语来说就是:将空闲内存块合并起来并称为"闲置链表"。然后在这块空闲空间进行划分,划出用户需要的与用户不需要的。然后把用户需要的给用户,不需要的返还给"闲置链表"。而用户使用free释放时候也是扔回去的过程。但是这时候的空闲空间是间断的片段,malloc函数就需要去整理整合这些片段,若空间达不到用户需要,malloc就会返还NULL指针,告诉用户空间不足。这就是为什么malloc需要检验返还值了。

    那么new和malloc的工作机制到底有什么不同呢= =?通过查找,我翻到了new的源码

     1 void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)  
     2         {       // 尝试申请内存空间  
     3         void *p;  //这个指针用于指向获取到的空间,且返回该指针给调用方,且设置为void*是为了能够指向任意格式
     4         while ((p = malloc(size)) == 0)  //利用malloc函数调用来申请内存空间,得到一个闲置链表
     5                 if (_callnewh(size) == 0)  
     6                 {       // 抛出没内存的信息  
     7                         _THROW_NCEE(_XSTD bad_alloc, );
     8                 }  
     9   
    10         return (p);  
    11         } 

    我们可以看到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
    ");  
            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。

    由于个人能力有限,只能进行浅层次的对比。

  • 相关阅读:
    Java学习之Math类理解
    Java学习之集合框架的迭代器--Iteratorjk及ListItertor接口
    Java学习关于随机数工具类--Random类
    集合框架学习之List接口
    Java学习关于集合框架的基础接口--Collection接口
    Java基础学习之数组基本属性和方法
    Java学习关于时间操作的应用类--Date类、Calendar类及其子类
    Java学习--异常处理及其应用类
    LR百分比模式
    lr函数之lr_eval_string()函数的使用学习
  • 原文地址:https://www.cnblogs.com/ThuremansC/p/6606622.html
Copyright © 2011-2022 走看看