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; // 清除并且释放内存
}
示例用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 也一样。

另外,需要注意的是:delete是运算符,是可以重载的。free是函数,不能重载。

本文转自:http://blog.csdn.net/zgbsoap/article/details/567970

C++中有了malloc/free 为什么还要new/delete?相关推荐

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

    有了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. Java中有了基本类型为什么还要有包装类型(封装类型)

    Java中基本数据类型与包装类型有: 基本类型 包装器类型 boolean Boolean char Character int Integer byte Byte short Short long ...

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

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

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

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

  7. malloc和new的区别

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

  8. malloc与new的区别

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

  9. malloc和new有什么区别

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

最新文章

  1. 全球科技大会鸿蒙,华为开发者大会:全球瞩目的“鸿蒙”面子和里子大格局
  2. 使用UltraWebGrid运行出错处理[原创]
  3. Python列表元素操作相关的2个函数和匿名函数
  4. VTK:参数化超椭球用法实战
  5. laravel-admin 使用 wangEditor 的一些小方法
  6. sharepoint ECMAScript对象模型系列
  7. 河南王牌计算机专业,河南计算机专业实力突出的7所大学,郑大位列次席,榜首实至名归...
  8. python3+requests+unittest_python3+requests+unittest:接口自动化测试(一)
  9. 如何制作一个横版格斗过关游戏 Cocos2d-x 2.0.4
  10. 机器学习 python 库_Python机器学习库
  11. 使用dsoframer演示ppt
  12. java解析JSON的方法汇总
  13. 解决idea工具下tomcat中文乱码问题
  14. swiper / 移动端触摸滑动插件 / 手机轮播插件
  15. aruba无线轻轨项目
  16. 深入理解设计模式-责任链模式(职责链模式)
  17. 08.vue.js实战笔记(计算属性、v-bind及class和style的绑定、内置指令、方法与事件)
  18. 游标v_cur的%notfound
  19. python数据框元素的性质_Pandas基础:文件读取与写入、Series和Dataframe、常用基本函数、排序...
  20. 从会员标签到画像 应该怎么做?

热门文章

  1. Redhat linux AS4 环境下iSCSI协议配置
  2. braft的LogEntry日志记录存储LogStorage
  3. docker中linux用户名密码,linuxea:尽可能不在docker镜像中嵌入配置或者密码
  4. java iecapt.exe_java替换url的域名和端口方法
  5. html5怎么改为vue_是否还在疑惑Vue.js中组件的data为什么是函数类型而不是对象类型...
  6. 华为承诺的鸿蒙系统兑现没有,华为鸿蒙系统遭截胡,安卓12系统率先出手
  7. java socketserver多线程_JAVA I/O(五)多线程网络Socket和ServerSocket
  8. python字典添加列表,将Python字典/列表插入到SQL数据库中最有效的方法是什么?...
  9. mysql数据库密码有效期_Mysql5.7.19密码已过有效期的处理过程(密码过期password_expired)...
  10. php如何实现qq第三方登录,PHP实现qq第三方登录