new和malloc的区别

1,new是操作符,malloc是函数;

2,new开辟内存失败抛出异常,malloc申请内存失败返回NULL;

3,new开辟的内存大小不需要指定,malloc需要指定;

4,new开辟的内存的类型会自动推导,不需要强转,malloc需要强转;

(小型操场)

5,实现原理:

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

new->malloc->构造函数->delete->析构函数->free;

malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。所以malloc没有初始化功能,需要用户自己初始化。(只能申请内存,不能初始化)

malloc原理:

malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc采用内存池的方式,先从内核态申请大块内存作为堆区,然后将堆区分为多个内存块,放在用户态的内存池中。当用户申请内存时直接从用户态的内存池堆分配一块合适的空闲块,就不需要进入内核态申请内存,除非内存池中的内存已经用完。

malloc在申请内存时,一般会通过brk或者mmap系统调用来进行内存申请。其中当申请内存小于128k时,会使用系统函数brk在堆区分配;而当申请内存大于等于128k时,会使用系统函数mmap在映射区分配。

new和malloc的区别_第1张图片

new和malloc申请的是虚拟地址还是内存地址

堆----》虚拟地址

free后的内存会归还操作系统吗---brk和mmap的区别

free怎么知道要释放多大的内存

你可能感兴趣的:(c++,开发语言)