zoukankan      html  css  js  c++  java
  • 小结《malloc与new之区别》

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

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

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

    4,C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

    5、new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void指针。

     

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

    二:new delete在实现上其实调用了malloc,free函数。

    三:new operator除了分配内存,还要调用构造函数。

    malloc函数只是负责分配内存

    摘自:http://binbin8497.javaeye.com/blog/492297

  • 相关阅读:
    Codeforces Gym 100571A A. Cursed Query 离线
    codeforces Gym 100500 J. Bye Bye Russia
    codeforces Gym 100500H H. ICPC Quest 水题
    codeforces Gym 100500H A. Potion of Immortality 简单DP
    Codeforces Gym 100500F Problem F. Door Lock 二分
    codeforces Gym 100500C D.Hall of Fame 排序
    spring data jpa 创建方法名进行简单查询
    Spring集成JPA提示Not an managed type
    hibernate配置文件中的catalog属性
    SonarLint插件的安装与使用
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1896392.html
Copyright © 2011-2022 走看看