永发信息网

C中delete和free有什么区别?

答案:1  悬赏:70  手机版
解决时间 2021-01-21 22:27
C中delete和free有什么区别?
最佳答案
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

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

因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。

我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见下例。

class Obj

{

public :

Obj(void){ cout < < “Initialization” < < endl; }

~Obj(void){ cout < < “Destroy” < < endl; }

void Initialize(void){ cout < < “Initialization” < < endl; }

void Destroy(void){ cout < < “Destroy” < < endl; }

};

void UseMallocFree(void)

{

Obj *a = (obj *)malloc(sizeof(obj)); // 申请动态内存

a-> Initialize(); // 初始化

//…

a-> Destroy(); // 清除工作

free(a); // 释放内存

}

void UseNewDelete(void)

{

Obj *a = new Obj; // 申请动态内存并且初始化

//…

delete a; // 清除并且释放内存

}

类Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数Initialize和Destroy来完成初始化与清除工作。函数UseNewDelete则简单得多。

所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
如何看懂史记
看的出是国产貂还是丹麦貂吗?
钢丝绳强度降低率是多少
关于城府的句子
模块电源的产品参数
网页对联关闭怎么做
求翻译韩国地址:CetaTech, Inc., TIC 296-3,
有乾快运(黄楼街道泓德物流园H仓库6号有乾快
小韩物流(北海路北50米小韩物流)地址在什么地
HELLO KITTY的来历
林德叉车和小松叉车哪个好
启发广场和水香提岸哪个小区好?昆山
宝骏560买8个月跑1万公里7.6万购买划算吗
高炜晟判入狱几年,麻烦大家了
求coco奶茶菜单
推荐资讯
求厦门火车站到翔安区新店公交路线。
3囗1x2口等于多少?怎么写竖式
我国的省级行政区中,位置最北的是________,
我要问个问题
希望中日友好相处用英语怎么说
我想在湖北省宜昌市养鹅,可当地人没有吃哦的
王绍龙点评:新泰山新对联 新
冰淇淋是谁发明的?冰淇淋是哪个国家发明的?
大连有啥特产没,我怎么去了一趟,啥好吃的都
拔火罐后应该注意些什么
电信积分换流量发什么
您好,我在玩熹妃传时时候,出来一个邮件,点
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?