zoukankan      html  css  js  c++  java
  • 基础知识:malloc与free,new与delete的区别

       

    引言

       

    想起很早之前接触C++的时候,就直接用new替代了之前cmalloc,感觉一下子酸爽了很多,要用malloc写很长的代码,一个new就解决了,最近准备找工作的面试,又重新看到了这个,稍微整理一下并扩展说明了一下mallocfreenewdelete的区别

       

    区别

       

    首先很重要的一点是mallocfreeC++/C语言的标准库函数,而new/deleteC++的运算符。其中虽然C++也保留了mallocfree,很大程度上是为了向C的兼容,C++里面还是newdelete用的比较多

       

    至于他们的共同点就是它们都可用于申请动态内存和释放内存。

       

    为什么会有new和delete

       

    既然C里面已经有了申请动态内存和释放内存的标准库函数,那么为什么在C++里还要用两个运算符去申请和释放内存呢

       

    主要是考虑到对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。

       

    C++是面向对象的编程,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。而由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free

       

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

       

    举例说明

       

    还是举一个例子比较好说明

       

    我们先看一看malloc/freenew/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;           // 清除并且释放内存

    }

       

    对类Obj的函数说明如下:

       

    Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。

       

    函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,必须调用成员函数InitializeDestroy来完成初始化与清除工作。

       

    而函数UseNewDelete则简单得多,不需要去调用成员函数Initialize和Destroy来完成初始化与清除工作。

       

    所以我们不要企图用malloc/free来完成动态对象的内存管理,注意这里是动态对象,对于动态对象来说应该用new/delete,而对于动态内存来说这两个都可以申请和释放。

       

    如果不是对象,而是一般的数据类型,由于内部数据类型的"对象"没有构造与析构的过程,对它们而言malloc/freenew/delete是等价的,相当于对数据类型分配内存而已。

       

    为什么C++还要保留malloc和free标准库函数呢

       

    之前也说到是因为C++程序要向C兼容,如果在C++中调用C函数,而C程序只能用malloc/free管理动态内存,考虑以下两种混搭的情况,会觉得十分别扭

       

    如果用free释放"new创建的动态对象",那么该对象因无法执行析构函数而可能导致程序出错。

    如果用delete释放"malloc申请的动态内存",理论上讲程序不会出错,但是该程序的可读性很差。

       

    所以new/delete必须配对使用,malloc/free也一样。

  • 相关阅读:
    poj 1743 Musical Theme 后缀数组
    poj 1743 Musical Theme 后缀数组
    cf 432D Prefixes and Suffixes kmp
    cf 432D Prefixes and Suffixes kmp
    hdu Data Structure? 线段树
    关于position和anchorPoint之间的关系
    ios POST 信息
    CALayers的代码示例
    CALayers详解
    ios中得sqlite使用基础
  • 原文地址:https://www.cnblogs.com/keedor/p/4463242.html
Copyright © 2011-2022 走看看