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

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

一. 执行内容:

malloc / free:

malloc 函数的参数接收所需分配的内存字节数,如果内存满足请求量,将返回指向被分配内存起始地址的指针;

free 释放指针所指向的内存,其中指针必须指向所释放内存空间的首地址;

new / delete:

new 分为两步:1).通过operator new 分配内存      2).为被分配的内存调用一个或多个构造函数构建对象;

delete 也分两步: 1).为将被释放的内存调用一个或多个析构函数      2).通过operator delete 释放内存;

 

 

二. 本质区别:

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

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

 

 

三. 两者联系:

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

 

 

四. 使用要点:

 

int *p1 = (int *)malloc(sizeof(int) * length); free(p1); int *p2 = new int[length]; delete [] p2;

 

1.malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数;

2.malloc 返回值的类型是void *,所以在调用malloc 时要显式地进行类型转换,将void * 转换成所需要的指针类型;

3.运算符new 使用起来要比函数malloc 要更简单在于能动态分配内存,new 内置了sizeof、类型转换和类型安全检查功能;对于非内部数据类型的对象而言,new 在创建动态对象的同时完成了初始化工作;如果对象有多个构造函数,那么new 的语句也可以有多种形式。

4.如果用new 创建对象数组,那么只能使用对象的无参数构造函数;

   Obj *objects = new Obj[100];            // RIGHT   

   Obj *objects = new Obj[100](1);       // WRONG

 

转载于:https://www.cnblogs.com/1203ljh/p/4734655.html

你可能感兴趣的文章
POJ-1185 炮兵阵地 动态规划+状态压缩
查看>>
NYOJ 366 D的小L
查看>>
PYTHON 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者...
查看>>
Docker 初识
查看>>
【12.16】VC++调用Word OLE进行自动化生成报表
查看>>
用Maven创建第一个web项目
查看>>
php中的抽象类(abstract class)和接口(interface)
查看>>
linux安装ActiveMQ
查看>>
面向对象与软件工程---团队作业1
查看>>
认识一下Kotlin语言,Android平台的Swift
查看>>
hdu5389 Zero Escape
查看>>
【转】android电池(四):电池 电量计(MAX17040)驱动分析篇
查看>>
android中的回调
查看>>
redis启动、清缓存命令
查看>>
Java的Clone
查看>>
CSS 弹出层 支持IE/FF/OP
查看>>
maven的配置-2019-4-13
查看>>
进程调度
查看>>
百练 2973 Skew数 解题报告
查看>>
C# 温故而知新:Stream篇(二)
查看>>