new/delete与malloc/free的区别是什么

来源:互联网 发布:js判断对象{}是否为空 编辑:程序博客网 时间:2024/05/22 11:52


1.

malloc/freeC/C++语言的标准库函数,要包含头文件<stdlib.h>

new/deleteC++运算符。不用包含头文件。

它们都可用于申请动态内存和释放内存。

但是new能够自动分配空间大小,而malloc需要计算字节数。

int *p = new int[2];  int *p = malloc(sizeof(int)*2);

2.

new/delete直接带具体类型的指针,malloc/free返回void类型的指针。

3.

new是类型安全的,而malloc不是,比如:

int* p = new float[2]; //编译时指出错误

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

new operator由两步构成,分别是 operator new construct先分配内存再调用构造函数进行初始化内存里的内容。

4.

对于非内部数据类型(int.char)的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete注意new/delete不是库函数。---简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。

A * PA = new A;  //分配内存并调用构造函数

delete PA  //回收内存并调用析构函数

5.

deletefree仅仅是告诉操作系统这块内存被释放可以用作他用,但是,由于没有重新对这块内存进行读写,所以内存中的变量数值并没有发生变化,出现野指针的情况。因此释放完内存后应该将指针指向位置为空NULL

6.

返回值。

malloc分配失败时,返回的是空指针

1993年前,c++一直要求在内存分配失败时operator  new返回0,现在则是要求operator  new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator  new(以及operator  new[])继续提供返回0功能。这些形式被称为无抛出,因为他们没用过一个throw,而是在使用new的入口点采用了nothrow对象:

class   widget{   ...   };

widget *pw1 = new widget;//分配失败抛出std::bad_alloc

if (pw1   ==   0)   ...//  这个检查一定失败

widget *pw2 = new  (nothrow)widget;   //若分配失败返回0

if   (pw2   ==  0)   ... //  这个检查可能会成功

7.

联系:

既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存,理论上讲程序不会出错,但是该程序的可读性很差。所以new/deletemalloc/free必须配对使用。