美文网首页
new and molloc

new and molloc

作者: 曹小恒 | 来源:发表于2018-04-03 15:13 被阅读0次
    1. 申请内存所在的位置不同
      new在自由储存区分配内存空间,malloc从堆上动态分配内存.

    2. 返回类型不同
      new在分配内存成功的时候,返回对象类型的指针,类型安全
      malloc返回void*,需要强制转换

    3. 分配失败时的返回值
      new抛出 bac_alloc 异常,不返回 NULL
      malloc返回 NULL

    4. 指定内存大小不同
      new不需要指定内存大小,编译器将自行计算
      malloc需要显式指定大小

    class A{}
    A *ptr = new A;
    A *ptr = (A*)malloc(sizeof(A));
    
    1. 是否调用构造函数和析构函数
      newdelete的操作步骤
    • 第一步:电泳 operator new 函数分配一块足够大的内存空间存储特定类型的对象
    • 第二步:运行构造函数,传入初值
    • 第三步:构造成功后,返回一个指向这个对象的指针.
    • 第四步:调用析构函数
    • 第五步:调用 operator delete 函数释放内存空间
    1. 对数组的处理
      new[]delete[]专门用来处理数组类型
    A *ptr = new A[10];//分配十个 A 对象
    delette []ptr;
    

    他会调用构造函数初始化每一个数组元素,对每个对象进行析构
    malloc只是给一块地址,和内存的地址,我们需要手动定义数组大小

    int *ptr = (int*) malloc(sizeof(int)*10)
    
    1. 是否可以被重载
      new 和 delete 可以被重载, malloc/free 不能

    2. 能否直观重新分配内存
      malloc 可以通过 realloc 函数来重新分配内存,new不行

    特征 new/delete malloc/free
    分配内存的位置 自由存储区
    分配成功的返回值 返回对象指针,类型安全 返回void*,需要强制转化
    分配失败的返回值 抛出异常 返回 NULL
    分配内存的大小 自动根据对象大小分配 需要显式手动分配
    处理数组 有专门的函数处理 需要计算大小后手动分配
    已分配内存的扩充 没有 realloc函数
    相互调用 可以调用 mallocfree 实现 不能
    如果内存不足 能制定函数或者重新制定分配器 无法处理
    重载 多种方式重载 不能
    析构函数和构造函数 调用 不调用

    相关文章

      网友评论

          本文标题:new and molloc

          本文链接:https://www.haomeiwen.com/subject/rywfhftx.html