有了malloc/free为什么还要new/delete ?
有了malloc/free为什么还要new/delete ?
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
我们先看一看malloc/free和new/delete如何实现对象的动态内存管理,见示例7-8。
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; // 清除并且释放内存 } |
示例7-8 用malloc/free和new/delete如何实现对象的动态内存管理
类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也一样。
有了malloc/free为什么还要new/delete ?相关推荐
- C++中有了malloc/free 为什么还要new/delete?
malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符.它们都可用于申请动态内存和释放内存. 对于非内部数据类型(内部数据类型是编译器本来就认识的,不需要用户 ...
- 有了malloc/free,为什么还要new/delete?
有了malloc/free,为什么还要new/delete malloc与free是C/C++的标准库函数,new/delete是C++的运算符. 对于非内部数据类型的对象而言,光用malloc/fr ...
- 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现
内存分布 一.C语言中的动态内存管理方式:malloc/calloc/realloc和free 1.malloc: 从堆上获得指定字节的内存空间,函数声明:void *malloc (int n); ...
- 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?
目录 一.内存分配模型 1.1 先看内存的分布状况 1.2 动态内存分配 1.3 C语言中分配内存的方式 1.4 C++中动态分配内存的方式 二.new和malloc的区别 2.1 属性 2.2 参数 ...
- 转载:malloc()与new()的区别详解
1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_byt ...
- malloc与new的区别
1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_byt ...
- malloc和new有什么区别
malloc和new有以下不同: new.delete是操作符,可以重载,只能在c++中使用. malloc.free是函数,可以覆盖,c.c++中都可以使用. new可以调用对象的构造函数,对应的d ...
- malloc和new的区别
鉴于上次腾讯一面涉及到了malloc/free和new/delete的区别,当时我回答的不够全面,在网上搜了搜,找到了一篇介绍得比较全面的文章,先将其转载至我的博客上,以供自己和大家一起学习,链接为: ...
- 内存管理模拟程序c语言,C语言 内存管理详解
本文出自: 伟大的Bill Gates曾经失言: 640K ought to be enough for everybody -Bill Gates 1981. 程序员们经常编写内存管理程序,往往提心 ...
最新文章
- Python2和Python3关于reload()用法的区别
- 从一段代码的汇编看计算机的工作原理
- CXF学习(4) 处理无法自动转换的复合数据类型
- firefox 3.0 在 windows 下的编译
- 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
- 在html中单选选择器,已选中单选按钮标签的CSS选择器
- 【React深入】深入分析虚拟DOM的渲染原理和特性
- 阿里数据中台大火,国外却在建设数据湖,这两者什么关系?
- mysql 插入汉字出现问号 解决方法
- [转]mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
- 苹果x人脸识别突然失灵_iPhone手机触摸屏失灵怎么办?成都苹果维修点教你轻松解决...
- LTE之3GPP_协议下载_协议命名
- Android CameraX适配Android11的踩坑之路
- 编程难?零基础如何学好编程?
- 五面拿下阿里飞猪offer,java开发程序员
- 关于表单防重复提交一些东东
- 卸载wps后桌面上的office文件图标变成了白色(亲测有效)
- JS提示缺少对象的一种解决办法
- 从新建文件夹开始构建ShadowPlay Engine(5)
- xp系统升级win7系统教程