new/delete与malloc/free的区别与联系

By AverageJoeWang
 标签:

一.概念

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

1.1.malloc/free

1.1.1.函数原型与说明

#该函数分配了nBytes个字节,并且返回指向这块内存的指针;若失败,返回一个空指针
void *malloc(long nBytes)
#该函数是将malloc分配的空间进行释放操作,使得别的程序可以占用该空间
void free(void *FirstByte)

1.1.2.内存操作

利用man malloc/free可以查看相关介绍在linux系统中

  • malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被分配的内存块起始位置

  • free函数释放的是指针指向的内存(不是释放的指针本身,不会删除指针本身),其中指针必须指向所释放内存空间的首地址

int *p = (int *)malloc(sizeof(int)*10);
free(p);

1.2.new/delete

new/delete不是函数,而是操作符号

1.2.1.操作时发生的事情

运算符 发生事件1 发生事件2
new 内存被分配(operator new函数进行) 为被分配的内存调用一个或多个构造函数构建对象
delete 为将被释放的内存调用一个或者多个析构函数 释放内存(operator delete函数进行)

1.2.2.特殊应用

int *pa = new int;//声明指针
delete pa;//销毁
//比较两者
int *pc = new int[10];//声明指针数组利用new
delete [] pc;//销毁数组时的方式

二.区别与联系

2.1.区别

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

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

  • new能够自动分配空间大小

  • new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能。

2.2.联系

既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?

  • 因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

  • 如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。

  • 如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差.

  • 所以new/delete,malloc/free必须配对使用。