有了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 ?相关推荐

  1. C++中有了malloc/free 为什么还要new/delete?

    malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符.它们都可用于申请动态内存和释放内存. 对于非内部数据类型(内部数据类型是编译器本来就认识的,不需要用户 ...

  2. 有了malloc/free,为什么还要new/delete?

    有了malloc/free,为什么还要new/delete malloc与free是C/C++的标准库函数,new/delete是C++的运算符. 对于非内部数据类型的对象而言,光用malloc/fr ...

  3. 内存分布malloc/calloc/realloc/free/new/delete、内存泄露、String模板、浅拷贝与深拷贝以及模拟string类的实现

    内存分布 一.C语言中的动态内存管理方式:malloc/calloc/realloc和free 1.malloc: 从堆上获得指定字节的内存空间,函数声明:void *malloc (int n); ...

  4. 一文解决new/delete与malloc/free相关问题:区别?注意事项?使用方式?

    目录 一.内存分配模型 1.1 先看内存的分布状况 1.2 动态内存分配 1.3 C语言中分配内存的方式 1.4 C++中动态分配内存的方式 二.new和malloc的区别 2.1 属性 2.2 参数 ...

  5. 转载:malloc()与new()的区别详解

    1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_byt ...

  6. malloc与new的区别

    1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(unsigned int num_byt ...

  7. malloc和new有什么区别

    malloc和new有以下不同: new.delete是操作符,可以重载,只能在c++中使用. malloc.free是函数,可以覆盖,c.c++中都可以使用. new可以调用对象的构造函数,对应的d ...

  8. malloc和new的区别

    鉴于上次腾讯一面涉及到了malloc/free和new/delete的区别,当时我回答的不够全面,在网上搜了搜,找到了一篇介绍得比较全面的文章,先将其转载至我的博客上,以供自己和大家一起学习,链接为: ...

  9. 内存管理模拟程序c语言,C语言 内存管理详解

    本文出自: 伟大的Bill Gates曾经失言: 640K ought to be enough for everybody -Bill Gates 1981. 程序员们经常编写内存管理程序,往往提心 ...

最新文章

  1. Python2和Python3关于reload()用法的区别
  2. 从一段代码的汇编看计算机的工作原理
  3. CXF学习(4) 处理无法自动转换的复合数据类型
  4. firefox 3.0 在 windows 下的编译
  5. 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
  6. 在html中单选选择器,已选中单选按钮标签的CSS选择器
  7. 【React深入】深入分析虚拟DOM的渲染原理和特性
  8. 阿里数据中台大火,国外却在建设数据湖,这两者什么关系?
  9. mysql 插入汉字出现问号 解决方法
  10. [转]mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
  11. 苹果x人脸识别突然失灵_iPhone手机触摸屏失灵怎么办?成都苹果维修点教你轻松解决...
  12. LTE之3GPP_协议下载_协议命名
  13. Android CameraX适配Android11的踩坑之路
  14. 编程难?零基础如何学好编程?
  15. 五面拿下阿里飞猪offer,java开发程序员
  16. 关于表单防重复提交一些东东
  17. 卸载wps后桌面上的office文件图标变成了白色(亲测有效)
  18. JS提示缺少对象的一种解决办法
  19. 从新建文件夹开始构建ShadowPlay Engine(5)
  20. xp系统升级win7系统教程

热门文章

  1. 青蛙跳台阶问题暨斐波那契数列
  2. C++ 基类私有成员会被继承吗
  3. 《Linux 性能及调优指南》1.4 硬盘I/O子系统
  4. IntelliJ IDEA15,PhpStorm10,WebStorm11激活破解
  5. 第 39 章 ThinkPHP--模型初步(下)
  6. Python3常用字符串操作
  7. clock()函数的使用
  8. 使用Windows Server 2003搭建一个asp+access网站
  9. python 集合 gather
  10. 如何显示Windows 10登录过程详细信息