用Win32SDK编程可以有多种方法分配内存
1.GlobalAlloc
2.HeapAlloc
3.LocalAlloc
4.VirtualAlloc(Ex)
以及标准C/C++中的
5.malloc
6.calloc
7.new请问:这些内存分配方法有何具体区别及联系,
以及分别在什么情况下使用比较适合?
1.GlobalAlloc
2.HeapAlloc
3.LocalAlloc
4.VirtualAlloc(Ex)
以及标准C/C++中的
5.malloc
6.calloc
7.new请问:这些内存分配方法有何具体区别及联系,
以及分别在什么情况下使用比较适合?
具体的书名忘了,但差不多。原作者现在到微软了,我出差在外,忘了名字。
看了后什么都明白了。
这么经典的问题,没人了解Windows的内存分配核心吗?
比如你用malloc或new分配一块内存,难道真是如此简单就分配了吗?
它一定是使用了Windows中的某个分配内存的API函数来实现的!而不是实现分配的.
重要的是前4个API函数有何区别.请高人指点,明确后立即给分!
用不同的方法申请了64KB大小空间,以下是返回的地址值(WindowsXPsp2):
LocalAlloc: 00143060
GlobalAlloc: 00143060
HeapAlloc: 00143060
VirtualAlloc: 00390000
malloc: 00410048
new: 00410048
可见LocalAlloc和GlobalAlloc的地址和堆分配是一样的,
MSDN也写着前两个函数只是为兼容16位版本而保留的,所以不建议再使用了.
VirtualAlloc分配比较复杂,可以设置分配内存的属性.
malloc和new的结果相同.
这样就共有3种结果了.
一般变量分配(除了静态变量和全局变量)都是在栈内进行!
而如果像分配到堆中去,(堆在Win16下对应局部堆和全局堆)
那就可以使用GlobalAlloc和LocalAlloc
VirtualAlloc是分配虚拟内存的!new也是分配到堆上
另外还有一个
Data区域和bss区域的问题,
我也不是很精通……
可以查看我的一个帖子
http://community.csdn.net/Expert/TopicView.asp?id=3733206
调用关系如下 new->malloc->HeapAlloc->VirtualAlloc->硬件驱动程序的_PageAlloc。
上面的调用关系是一般的WIN32编译器的调用顺序。
其中HeapAlloc已经实现了malloc的那些小块内存管理,以Heap开头的有一系列函数,你会发现它与malloc/free等可以对应起来。
但是Borland和VC编译器稍有不同,它们选择了自己实现了malloc,而不是直接对Heap*函数做了简单包装。
当然,有些C++编译器new并不是先调用malloc,然后调用构造函数,但总的来说,内存的调用顺序如上。LocalAlloc和GlobalAlloc是遗留函数。
malloc(msvcrt.malloc)和new(msvcrt.??2@YAPAXI@Z)的函数体大部分(主要是核心部分)是相同的,所以结果分配也是相同的.
这两个函数都是调用kernel32.HeapAlloc实现的.以下是我跟踪出来的详细调用关系:
msvcrt.malloc => kernel32.HeapAlloc(ntdll.RtlAllocateHeap)
msvcrt.??2@YAPAXI@Z => kernel32.HeapAlloc(ntdll.RtlAllocateHeap)
kernel32.LocalAlloc => ntdll.RtlAllocateHeap
kernel32.GlobleAlloc => ntdll.RtlAllocateHeap
kernel32.HeapAlloc == ntdll.RtlAllocateHeap
kernel32.VirtualAlloc => kernel32.VirtualAllocEx
kernel32.VirtualAllocEx=> ntdll.NtAllocateVirtualMemory
ntdll.RtlAllocateHeap => ntdll.NtAllocateVirtualMemory
ntdll.NtAllocateVirtualMemory => ntdll.KiFastSystemCall
ntdll.KiFastSystemCall => sysenter指令 (0F34)(注意kernel32中实际没有HeapAlloc的入口地址,而是直接映射到ntdll.RtlAllocateHeap的入口)
new分配对象内存后,会调用对象的构造函数用C++下推荐使用 new