美文网首页C++基础知识
new和malloc的区别

new和malloc的区别

作者: 安然_fc00 | 来源:发表于2017-03-20 23:18 被阅读17次

    new和malloc都用于动态申请内存

    1. 从本质上来说,malloc是C中的函数,需要声明特定的头文件。而new是C++中的关键字(操作符),它本身不是函数,所以不依赖于头文件,C++译器就可以把new编译成目标代码(还会根据参数的类型插入相应的构造函数)。
    2. 从使用上来说,如下几点不同:
      • new和delete是操作符,可以重载,只能在C++中使用。而malloc,free是函数,可以覆盖,C、C++中都可以使用。

      • new可以自动计算所需要的字节大小。而malloc必须人为的计算出所需要的字节数。在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes,注意malloc(-1)是禁止的,但是在某些系统中是不允许malloc(0)的。

      • 分配内存成功的话,new返回指定类型的指针。而malloc返回void指针,可以在返回后强行转换为实际类型的指针。对于C++,如果写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯。

      • 分配内存失败时,new会throw一个异常std::bad_alloc。而malloc会返回空指针。

      • new可以调用对象的构造函数,对应的delete调用相应的析构函数。而malloc仅仅分配内存,free仅仅回收内存,并不执行构造函数和析构函数。

    在规范的程序中我们有必要按照这样的格式去使用malloc及free:

    type *p;
    if(NULL == (p = (type*)malloc(sizeof(type))))/*请使用if来判断,这是有必要的*/
    {    
         perror(error...);
         exit(1);
    }
    /*其它代码*/
    free(p);
    p = NULL;/*请加上这句*/
    

    malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。比如想分配100个int类型的空间:

    int *p = (int*)malloc(sizeof(int) * 100);//分配可以放得下100个整数的内存空间。
    

    另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
    除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
    对其做一个特例补充

    char *ptr;
    if((ptr = (char*)malloc(0)) == NULL)    puts(Got an null pointer);
    else     puts(Got a valid pointer);
    

    此时得到的是Got a valid pointer。把0赋给malloc能得到一个合法的指针。

    new/delete和malloc/free的效率比较:

    1.new/delete的实现其实是调用了malloc/free的。
    2.不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete,因为new/delete会自动调用构造析构函数。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
    3.既然new/delete的功能完全覆盖了malloc/free,为什么C++不malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

    参考文章:

    https://zhidao.baidu.com/question/1370118115766445699.html?fr=iks&word=new%BA%CDmalloc%B6%BC%C4%DC%B4%B4%BD%A8%D0%C2%B5%C4%B6%D4%CF%F3%2C%C7%F8%B1%F0%D4%DA%C4%C4%2C%C4%C4%B8%F6%D0%A7%C2%CA%B8%FC%B8%DF&ie=gbk

    相关文章

      网友评论

        本文标题:new和malloc的区别

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