new vs malloc


  • 1、new 是c++中的操作符,malloc是c 中的一个函数 2、new 不止是分配内存,而且会调用类的构造函数,同理delete会调用类的析构函数,而malloc则只分配内存,不会进行初始化类成员的工作,同样free也不会调用析构函数 3、内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。 4、new 和 malloc效率比较

    new可以认为是malloc加构造函数的执行。

    new出来的指针是直接带类型信息的。

    而malloc返回的都是void指针。

    一:new delete 是运算符,malloc,free是函数

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

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

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

    malloc函数只是负责分配内存。

     

    1. malloc是库函数,在C++程序中,要用到malloc函数,必须包含malloc.h。malloc函数的原型是:void *malloc( size_t size ),其中,size是分配的空间大小。该函数返回一个void类型的指针,因此,在用malloc函数时,往往需要进行数据类型的强制转换:

                  int *pm = (int*)malloc(2);

                 myclass *pO1 = (myclass *)malloc(2); //myclass是一个自定义的类

           new是C++的一个运算符,一般用法如下:

    int *p = new int[10];

                  myclass *pO = new myclass;

    2. 在分配空间时,malloc只是分配了指定大小的空间,并没有初始化,没有调用类的构造函数。而new不仅分配了空间,同时进行了初始化工作,调用了该对象的构造函数。

    如下面的一个例程所示:

    #include <iostream.h>

    #include <malloc.h>

     

    class myclass

     

    {

    public:

        myclass();

        void myfoo();

    private:

        int m_nindex;

    };

     

    myclass::myclass()

     

    {

        m_nindex = 1;

    }

    void myclass::myfoo()

     

    {

        cout << " myfoo : m_nindex = " << m_nindex << endl;

    }

     

    int main()

     

    {

        int *p = new int[10];

        myclass *pO = new myclass;

        myclass *pO1 = (myclass *)malloc(2);

     

        for(int i =0; i<10; i++)

     

        {

            p[i] = i;

            cout << p[i] << "    ";

        }

     

        cout << endl;

        pO->myfoo();

     

        pO1[0].myfoo();

        pO1[1].myfoo();

     

        delete[] p;

        delete pO;

        free(pO1);

     

        return 0;

    }

     

    new调用了类myclass的构造函数,而malloc只是分配了空间,并没有调用构造函数,因此会出现调用myfoo函数时,输出的m_nindex结果具有随机性。也可以通过断点调试观察发现,new调用了构造函数而malloc没有. 

    另外注意,由于mallocnew都是在堆上分配的空间,无法自动释放,需要调用free/delete释放空间。malloc分配的空间用free释放,而new分配的空间用delete释放。

     

### 新与 `malloc` 的内存分配差异 在C++中,`new` 和 `malloc()` 都用于动态内存分配,但是两者之间存在显著的区别。 #### 功能特性 - **对象初始化** 使用 `new` 不仅会分配所需的内存量,还会调用相应的构造函数来初始化新创建的对象。而 `malloc()` 只负责分配指定大小的未初始化存储空间[^1]。 - **返回类型** `new` 返回的是所请求类型的指针;相反,`malloc()` 总是指向无特定类型的 void 类型指针,这通常需要被转换为目标数据类型的指针以便于后续操作。 ```cpp // 使用 new 分配并初始化一个整数 int* pNewInt = new int(10); // 使用 malloc 分配相同数量的空间但不自动初始化 int* pMallocInt = static_cast<int*>(malloc(sizeof(int))); *pMallocInt = 10; ``` #### 错误处理机制 当无法满足申请时: - 对于 `new`, 如果抛出了异常,则表示未能成功完成分配过程; - 而对于 `malloc()`, 它会在失败情况下返回 NULL 值而不是引发任何错误信号. #### 内存释放方式 重要的一点在于如何正确地回收这些资源: - 当通过 `delete[]` 或者简单的 `delete` 来销毁由 `new/new[]` 创建出来的实体时, - 应该采用对应的 `free()` 函数去释放那些经由 `malloc()/calloc()/realloc()` 获取来的区域. 尝试混合使用不同的分配器(比如用 `delete` 解除 `malloc()` 分配的记忆体或是反过来),将会导致不可预测的行为甚至程序崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值