在Windows中,系统为大家提供了很多种内存的分配方式,包括new,malloc(),HeapAlloc(),VirtualAlloc()等,那么它们的区别是什么呢?彼此有没有联系呢?下面对此来做个比较和总结。
(1)new是C++的运算符,操作的是默认堆,具备编译器可控制的操作,可以完成C++类对象的构造,适合小型数据的内存分配,操作简单方便。
(2)malloc是c提供的库函数,操作的是默认堆,适合小型数据的内存分配,操作简单方便。
(3)HeapAlloc操作的是默认的堆或自定义堆,效率高,适合小型数据或中型数据内存分配
(4)VirtualAlloc()操作的是虚拟内存,适合大型数据的内存分配。
new、malloc、HeapAlloc()所操作的堆都是虚拟内存的一部分,编译器或程序无法分辨当前分配的空间是物理内存还是在磁盘页文件中。在Windows系统中,程序在应用层调用malloc()和new来分配内存,系统最终都会调用VirtualAlloc()函数。但是malloc()和new不是直接调用它。malloc()首先调用HeapAlloc(),然后HeapAlloc()调用VirtualAlloc().HeapAlloc()就是在自己已经分配好的内存上修改自己的属性。如果HeapAlloc()失败了,那么malloc()会调用HeapCreate(),重新建一个堆。HeapCreate()首先调用VirtualAlloc()分配一个比较大的内存,这个大小是malloc()函数决定的,比如代码中malloc(200),那么HeapCreate()最少会分出4096字节出来,因为4096正式i386机器的内存页的大小,并且把这4096字节都设置成不可访问。HeapCreate()后,malloc又去调用一次HeapAlloc(),也就是从这4096字节大小中划出200字节可访问的内存。
C++中new运算符除了调用malloc()来分配内存外,还对分配的内存调用了C++类的构造函数进行初始化。
所以,内存分配函数的顺序是:new->malloc->HeapAlloc()->VirtualAlloc()->驱动程序的_PageAlloc();