new和malloc区别

Posted 杨龙飞的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了new和malloc区别相关的知识,希望对你有一定的参考价值。

1. 区别

  • new的功能是在堆区新建了一个对象,并返回该对象的指针,所谓的【新建对象】的意思就是,将调用该类的构造函数,因为如果不构造的话,就不能称之为一个对象。
  • malloc只是机械的分配了一块内存,如果用malloc在堆区创建一个对象的话,是不会调用构造函数的,严格来说malloc不能算是新建了一个对象,只能说是分配了一块与该类对象大小相同的内存而已,然后强行把它解释为【这是一个对象】,按这个逻辑来,也不存在构造函数什么事.
  • 用delelte 去释放一个堆区的对象,会调用该对象的析构函数.
  • 用free去释放一个堆区的对象,不会调用该对象的析构函数.
    看一个例子
#include<iostream>
#include <malloc.h>
using namespace std;
class TEST
private:
    int num1;
    int num2;
public:
    TEST()
        num1 = 10;
        num2 = 20;
    
    ~TEST()
       cout << "调用了析构函数"<<endl;
    
    void Print()
        cout << num1 << " " <<num2 <<endl;
    
;
int main(int argc,char *argv[])

    //用malloc()函数在堆区分配一块内存空间,然后用强制类型转换该内存空间
    //解释为是一个TEST类对象,这不会调用TEST的默认构造函数
    TEST *pObj = (TEST *)malloc(sizeof(TEST));
    pObj->Print(); 

    //用new在堆区创建一个TEST类的对象,这回调用TEST类的默认构造函数
    TEST *pObj2 = new TEST;
    pObj2->Print();
   return 0;
结果如下:
yang@yang:~$ ./a.out 
0 0   //malloc分配的内存,强制类型转换为TEST对象,没有调用构造函数.
10 20 //new分配对象调用了构造函数.
调用了析构函数 //delete 调用了析构函数,free 没有.
  • malloc/free是C/C++中的方法(函数),new/delete 是C++中的操作符.

2.有了malloc/free,为什么还要new/delete?

(1)malloc与free是C++/C语言的标准库函数,new/delete是C++运算符,它们都可用于申请动态内存和释放内存.
(2)对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,由于malloc/free是库函数而不是运算符,不再编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加给malloc/free;
(3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

以上是关于new和malloc区别的主要内容,如果未能解决你的问题,请参考以下文章

C++中new出得对象与C中的malloc出得有啥联系和区别?

new和malloc的区别

C ++中的“new”和“malloc”和“calloc”有啥区别? [复制]

new malloc区别

Malloc 和 new 运算符分配内存有啥区别? [复制]

Malloc 和 new 运算符分配内存有啥区别? [复制]