博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
malloc/free与new/delete的区别
阅读量:4323 次
发布时间:2019-06-06

本文共 1543 字,大约阅读时间需要 5 分钟。

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则不需要。

转载于:https://www.cnblogs.com/xfxu/p/4086818.html

你可能感兴趣的文章
Codeforces 517 #B
查看>>
实验四
查看>>
Scramble String
查看>>
php之接口概念
查看>>
01、计算机原理结构,及冯诺依曼体系结构
查看>>
Python 列表基本操作
查看>>
Linux TC基于CBQ队列的流量管理范例
查看>>
Python hashlib and hmac
查看>>
Fitnesse Page 简单使用
查看>>
C#.net 创建XML
查看>>
1057 数零壹
查看>>
隐马尔科夫模型(上)
查看>>
asp.net mvc FluentValidation 的使用
查看>>
java JvM
查看>>
HDU 1009 Just a Hook
查看>>
python基础之数据类型
查看>>
CSS居中初探
查看>>
element-ui table 点击分页table滚动到顶部
查看>>
UVa 1585 Score 得分 题解
查看>>
洛谷 P2197 nim游戏
查看>>