new/delete和malloc/free的区别

 一,malloc/free:

     void*malloc(size_t size):该函数分配了size个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)malloc 返回值的类型是void*,所以函数本身并不知道要申请的内存用来存储什么类型的数据。在调用malloc时一般需要显式地进行类型转换,将void * 转换成所需要的指针类型。

     void free( void * p ):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。指针的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放指针p指向的内存。如果p 是NULL 指针,那么free对p 无论操作多少次都不会出问题。如果p 不是NULL指针,那么free 对p连续操作两次就会导致程序运行错误。

二,new/delete:

    new的时候会有两个事件发生:

          1).内存被分配(通过operator new函数) 

        2).为被分配的内存调用一个或多个构造函数构建对象

    delete的时候,也有两件事发生:

         1).为将被释放的内存调用一个或多个析构函数  

          2).释放内存(通过operator delete 函数)。

       如果用new创建对象数组,那么只能使用对象的无参数构造函数。 如果在调用new时使用了[],则在调用delete时也使用[],如果你在调用new的时候没有[],那么也不应该在调用时使用[]。new/delete是未加括号,delete便假设删除对象是单一对象。否则便假设删除对象是个数组

三,malloc/free和new/delete 的本质区别:

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

2.new能够自动分配空间大小

3.对于用户自定义的对象而言,用maloc/free无法满足动态管理对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++需要一个能对对象完成动态内存分配和初始化工作的运算符new,以及一个能对对象完成清理与释放内存工作的运算符delete---简而言之new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。

四、malloc/free和new/delete 的联系

    由于C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete,malloc/free必须配对使用。

猜你喜欢

转载自blog.csdn.net/hnzziafyz/article/details/52201864