zoukankan      html  css  js  c++  java
  • malloc/free与new/delete的区别

    malloc/free与new/delete的区别:

    相同点:都可用于动态内存分配与释放

    不同点:

    1):操作对象有所不同。

    malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符

    由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,所以无法执行构造函数和析构函数;

    new的执行过程:

    //new的执行过程:
    1:首先调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,用来保存指定类型的一个对象;
    2:接下来,运行该类型的一个构造函数,用指定初始化式构造对象;
    3:最后返回指向新分配并构造的对象的指针。

    delete的执行过程:

    1:首先,对sp指向的对象运行适当的析构函数2:然后,用过调用名为operator delete的标准库函数释放该对象所用内存。

    以上operator new 与 operator delete 分别对应于malloc 与free。

    2):用法上也有所不同:

    函数malloc的原型如下:

    void *malloc(size_t size);

    用malloc申请一块长度为lengh的整形类型的内存,程序如下:

    int *p = (int*)malloc( sizeof(int) *length);
    1:malloc返回值的类型为void*,所以在调用malloc时要显式地进行类型转换,将void*转换成所需要的指针类型;
    2:malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数

    函数free的原型如下:

    void free(void *memblock);
    语句free(p)用来释放内存,如果p为NULL指针,那么无论free对p进行多少次操作都不会出现问题;
    如果p不是NULL指针,那么free对p连续操作两次就会导致程序运行错误。

    运算符new使用起来就比函数malloc简单多了,例如:

    int *p2 = new int[length];

    这是因为new内置了sizeof、类型转换和类型安全检查功能,对于非内部数据类型的对象而言,new在创建动态对象的同时完成了初始化工作(调用构造函数)。
    如果用new创建数组,那么只能使用对象的无参数构造函数。例如:

    Obj *objects = new Obj[100];//创建100个动态对象

    不能写成:

    Obj *objects = new Obj[100](1);//创建100个动态对象并同时赋值为1 ERROR

    在用delete释放对象数组时,留意不要丢了符号"[]"。例如:

    delete []objects;//正确的用法
    delete objects;//错误的用法

    总结:

    1):malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符

    2):new自动计算需要分配的空间,而malloc需要手工计算计算字节数;

    3):new是类型安全的,而malloc不是;例如:

    int *p = new float[2];//编译时指出错误
    int *p = (int*)malloc(2*sizeof(float));//编译时无法指出错误

    4);new调用operator new分配足够的空间,并调用相关对象的构造函数,而malloc不能调用构造函数;

    delete调用相关对象的析构函数,然后调用operator delete以释放空间,而malloc不能调用析构函数;

    5):malloc/free需要库文件支持,new/delete则不需要。

  • 相关阅读:
    JavaScript使用技巧精萃
    小谈js事件
    更深入地了解H1N1型流感病毒
    Oracle的一些常用操作
    JS刷新页面
    asp.net Excel导入&导出(转)
    [转]我的敏捷开发实践
    汉字转全拼,简拼组件
    深度复制
    无法删除注册表健值
  • 原文地址:https://www.cnblogs.com/xfxu/p/4086818.html
Copyright © 2011-2022 走看看