zoukankan      html  css  js  c++  java
  • [转载]有了 malloc/free 为什么还要 new/delete ?

      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 也一样。

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/jiayouwyhit/p/3150798.html
Copyright © 2011-2022 走看看