new和malloc的区别

  1. malloc和free是c++/c语言的库函数,需要头文件支持;new和delete是C++的关键字,需要编译器支持。

  2. 使用new操作符申请内存分配时,无需指定内存块的大小,编译器会根据类型信息自行计算。而malloc函数则需要显示地支持所需内存的大小。

  3. new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无需进行类型转换,故new是符合类型安全性的操作符。而malloc内存分配成功则是返回void*,需要通过强制类型转换将void*指针转换成我们需要的类型。

  4. new内存分配失败时,会抛出bad_alloc异常。malloc分配内存失败时返回NULL。

  5. new操作符申请内存分配过程,先调用operator new函数,申请足够的内存(通常底层使用malloc实现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete()释放内存(通常底层使用free实现)。

    malloc、free是库函数,只能动态的申请和释放内存,无法强制其做自定义类型对象的构造和析构。

  6. C++允许重载new/delete操作符,特别的,布局new的就不需要为对象分配内存,而是指定了一个地址作为内存起始区域,new在这段内存上为对象调用构造函数完成初始化工作,并返回此地址。而malloc/free不允许重载。

  7. new操作符从自由存储区(free store)上为对象动态分配内存,而malloc函数从堆上动态分配内存。

自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配,C语言使用malloc从堆上分配内存,使用free释放已分配的对应内存。自由存储区不等于堆,如上所述,布局new就可以不位于堆中。

//  返回类型为int*类型,大小为sizeof(int)
int *p;
p = new int;
//  返回类型为int*类型,大小为sizeof(int*)*50
int *pa;
pa = new int[50];

既然new、delete的功能完全覆盖了malloc、free,为什么C++不把malloc、free淘汰呢?

因为c++程序经常调用c程序,而c程序只能用malloc、free管理动态内存。
new、delete面向对象,而malloc、free面向内存。

malloc的实质:

malloc有一个空闲链表,该空闲链表将堆中可用的内存块连接起来。调用malloc函数时,它沿空闲链表寻找一个足以满足用户请求的内存块,然后将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到空闲链表上。调用free函数时,它将用户释放的内存块连接到空闲链表上。

到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有满足用户要求的内存片段。于是,malloc函数请求延时,并开始在空闲链上检查各内存片段并对它们进行整理,将相邻的小空闲块合并成较大的空闲块。如果还是无法获得满足要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

malloc()哪里获得内存空间:

从堆里面获得内存空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,寻找第一个空间大于所申请空间的堆结点,便将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

什么是堆:堆是同一进程下线程共享的空间,分全局堆和局部堆。全局堆是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统申请额外的堆。但要记得释放内存,否则会导致内存泄漏。

什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。

参考文章:
new和malloc的区别
new和malloc的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值