zoukankan      html  css  js  c++  java
  • malloc和new的比较

    摘要:本文主要分析了malloc和new两者的区别。

    1、申请的内存所处的位置

    • malloc是c语言中的概念,申请的是堆中的内存空间。堆是计算机操作系统中特殊分配出来的一个内存区域,用于程序的内存动态分配。
    • new是c++中的概念,申请的空间称之为自由存储区。自由存储区是针对于new的一个概念,可以理解为凡是用new申请的空间,都可以称之为自由存储区。

    注意:自由存储区不一定是堆,也有可能是静态存储区。

    2、返回类型

    • new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。
    • malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。

    3、内存分配失败的返回值

    • new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;
    • malloc分配内存失败时返回NULL。

    4、是否需要指定申请内存的大小

    • 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。
    • malloc则需要显式地指出所需内存的尺寸。

    5、是否调用析构函数和构造函数

    使用new操作符来分配对象内存时会经历三个步骤:

    • 第一步:调用operator new 函数(对于数组是operator new[])分配一块足够大的,原始的,未命名的内存空间以便存储特定类型的对象。
    • 第二步:编译器运行相应的构造函数以构造对象,并为其传入初值。
    • 第三部:对象构造完成后,返回一个指向该对象的指针。

    使用delete操作符来释放对象内存时会经历两个步骤:

    • 第一步:调用对象的析构函数。
    • 第二步:编译器调用operator delete(或operator delete[])函数释放内存空间。

    总之来说,new/delete会调用对象的构造函数/析构函数以完成对象的构造/析构。

    但是malloc却不会调用构造函数/析构函数。

    6、对于数组的处理

    • C++提供了new[]与delete[]来专门处理数组类型:new对数组的支持体现在它会分别调用构造函数函数初始化每一个数组元素,释放对象时为每个对象调用析构函数。注意delete[]要与new[]配套使用,不然会找出数组对象部分释放的现象,造成内存泄漏。
    • C语言中的malloc,它并知道你在这块内存上要放的数组还是啥别的东西,反正它就给你一块原始的内存,在给你个内存的地址就完事。所以如果要动态分配一个数组的内存,还需要我们手动自定数组的大小。

    7、能够直观地重新分配内存

    使用malloc分配的内存后,如果在使用过程中发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大可分配的内存地址,并且返回原来的地址指针;如果空间不够,先按照新指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来的内存区域。new没有这样直观的配套设施来扩充内存。

    8、是否可以被重载

    new可以被重载,而malloc不可以被重载。

  • 相关阅读:
    HDU 5714
    C++ 中的名称冲突之 "y1"
    FFT 模板
    Modular Query
    找礼物(find)(模拟)
    水流(water)(BFS)(DFS)
    单词接龙(dragon)(BFS)
    细菌(disease) (位运算)(状态压缩)
    Diamond Collector (动态规划)
    超级素数(sprime) (BFS)
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11563721.html
Copyright © 2011-2022 走看看