malloc 与free 是C++/C 语言的标准库函数,new/delete 是C++的运算符.他们都可以用于申请动态内存和释放内存。

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

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

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

Cpp代码

  1. class Obj 
  2. public: 
  3.     Obj(void) 
  4.     { 
  5.         cout << "Initialization" << endl; 
  6.     } 
  7.     ~Obj(void) 
  8.     { 
  9.         cout << "Destroy" << endl; 
  10.     } 
  11. void Initialize(void) 
  12.     { 
  13.         cout << "Initialization" << endl; 
  14.     } 
  15. void Destroy(void) 
  16.     { 
  17.         cout << "Destroy" << endl; 
  18.     } 
  19. }; 

Cpp代码

  1. void UseMallocFree(void) 
  2.     Obj *a = (Obj *)malloc(sizeof(Obj));//申请动态内存
  3.     a->Initialize(); 
  4. //...
  5.     a->Destroy();  //清除工作
  6.     free(a);  //释放内存

Cpp代码

  1. void UseNewDelete(void) 
  2.     Obj *a = new Obj;  //申请动态内存并且初始化
  3. //...
  4. 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 也一样。

[转载]有了 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是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的 ...

  3. 高质量程序设计指南C/C++语言——有了malloc/free为什么还要new/delete?

  4. malloc 和new , free 和delete的区别

    #include <iostream>using namespace std;class user{ public: int age; int number; void test() { ...

  5. 《转载》GET,POST,PUT,DELETE的区别

    本文转载自:转载请说明出处,谢谢[hyddd(http://www.cnblogs.com/hyddd/)] Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT, ...

  6. C/C++语言的标准库函数malloc/free与运算符new/delete的区别

    概括地说 1.malloc与free是C++/C的标准库函数,new/delete是C++的运算符,它们都可用于申请动态内存和释放内存. 2.对于非内部数据类型的对象而言,只用malloc/free无 ...

  7. 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解

    转自:http://www.jb51.net/article/39199.htm 本篇文章是对MySQL数据库INSERT.UPDATE.DELETE以及REPLACE语句的用法进行了详细的分析介绍, ...

  8. malloc 函数工作机制(转)

    malloc()工作机制 malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表.调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块.然后,将 ...

  9. malloc和free的区别

    1,malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存. 2,对于非内部数据类型的对象而言,光用maloc/free无法满足动 ...

随机推荐

  1. web前端跨域方案

    ajax跨域请求   qzfl实现 跨子域的xhr 原生xhr不支持跨域,通过iframe+proxy.html达到跨子域 假如A页面要请求B页面,A.B跨子域.A创建指向B的proxy页的ifram ...

  2. Java 参数的一些心得

    java 对象入参是传入的是引用(一块内存), 基础类型是值(复制内容),测试代码如下 public class TestA { private String name; public String ...

  3. unity3d 截屏

    原地址:http://www.cnblogs.com/88999660/archive/2013/01/21/2869747.html void OnGUI(){ if(GUI.Button(new ...

  4. Coursera台大机器学习课程笔记15 -- Three Learning Principles

    这节课是最后一节,讲的是做机器学习的三个原则. 第一个是Occan's razor,即越简单越好.接着解释了什么是简单的hypothesis,什么是简单的model.关于为什么越简单越好,林老师从大致 ...

  5. DICOM:Ubuntu14环境下安装dcm4chee+oviyam2.1

    背景: 之前博文DICOM:开源DICOM服务框架DCM4CHEE安装中曾介绍过在Windows7环境下安装部署dcm4chee.近期公司项目需要与部署到Linux系统的远端基于dcm4chee框架的 ...

  6. Linux init进程详解

    init模块 一般来说,Linux程序只能用另一个Linux程序启动.例如,登录Linux终端程序Mingetty. 但终端程序又由谁启动呢?在计算机上启动Linux时,内核装入并启动init程序. ...

  7. HDOJ 1856

    #include<cstdio> #include<cstdlib> typedef struct ufse *ufset; struct ufse { ]; ]; }UFS; ...

  8. BZOJ 3540 realtime-update 解题

    分析一下题意,大约是给定一串牛,然后找到一个跨越距离最长的牛子串使得在这个范围内白牛和花牛一样多. 白牛可以任意涂成花牛. 既然"白牛可以任意涂成花牛",那么我们需要找到一个最长的 ...

  9. MySQL性能优化的最佳经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

  10. Timer1控件的属性