heapalloc,globalalloc,virtualalloc,new的异同?
以上几个函数都可用于分配内存,但好象一般用GLOBALALLOC ,NEW,malloc就可以解决很多问题了,那为什么还有virtualalloc及heapalloc呢 ,所以想对这几个函数多了解一下,哪位大侠知道应该在什么场合使用不同的函数呢? 问题点数:40、回复次数:7Top
1 楼Robert2001(Robert2001)回复于 2001-02-03 10:54:00 得分 0
..Top
2 楼zzh()回复于 2001-02-04 10:26:00 得分 0
其实没有必要使用这么多,使得程序过于难读,使用new或GlobalAlloc这两个函数就可以满足须求了。HeapAlloc是从堆中分配内存,所分配的内存不需要使用GlobalLock来锁住,而使用GlobalAlloc所分配的内存,如果在使用过程当中,分使用GlobalLock来锁住,在使用完成后再GlobalUnlockTop
3 楼stzhou(阿毛)回复于 2001-02-04 12:14:00 得分 0
不同意zzh()的说法,内存的合理分配关系到应用程序的效率问题,不同的场合,不同的条件下对内存的分配有着特定的要求,绝不仅仅是new或GlobalAlloc这两个函数可以解决了的。
另外GlobalAlloc(Win32下等于LocalAlloc)的得以保存更多是考虑到了Win32与Win16的兼容,这样的内存空间在Free之前会一直处于调拨状态。Top
4 楼edyang(化石)回复于 2001-02-04 20:44:00 得分 0
Heap 管理函数主要用于管理较小的内存块(一般情况下认为是 < 4MB)。GlobalAlloc 一类的函数好像是 16bit API 的遗留物,WIN32 内存管理中部分全局和局部 Heap,只有一种属于进程的 heap。VirtualAlloc 一类的函数是虚拟内存管理的。Top
5 楼sjy()回复于 2001-02-04 22:22:00 得分 0
刚好这两天Top
6 楼sjy()回复于 2001-02-04 22:33:00 得分 0
我有空查了查书,1。说HEALPALLOC的用法是:先用CREATEHEAP建立一私有堆,(这个堆将会区别于已有程序的缺省堆,而NEW,MALLOC,都是从程序的缺省堆中分配,这是不同的,但使用这个私有堆而不用缺洎堆有什么好处我就不清楚了。2,VIRTUALALLOC是用于管理虚存,可能分配较大块的内存时比较好用,在需要时可以提交它将它调至物理内存进行操作。但GLOBALALLOC好象也是在GLOBALLOCK时才将内存锁定在物理内存,好象差别也不大。我提这个问题是想加深对内存分配的了解,欢迎各位大侠进行讨论,Top
7 楼bugn(unknown& whoami)回复于 2001-02-04 23:22:00 得分 40
对于不同场合用不同函数的问题edyang说得不错。
对于GlobalAlloc我只知道有一种情况下要用就是CreateStreamOnHGlobal。另外CoTaskMemAlloc也是特定情况下非用不可的。
建议看看MSDN中有关文章,说得很明白的:
MSDN->Technical Articles->Windows Platform->Memory
to sjy:
> 而NEW,MALLOC,都是从程序的缺省堆中分配,
这句话有问题,虽然书上这样说过 :)
crt(malloc,new等)用的堆根据不同的crt实现有关,如果拿不准就去参考一下你用的crt的源代码。现在一般的CRT的实现都有自己独立的堆。GlobalAlloc/LocalAlloc/CoTaskMemAlloc/IMalloc都用的是缺省堆,但这些函数在特定场合又不能用HeapAlloc(GetProcessHeap(), ...)来代替。
至于为什么用私有堆,我记得Jeffey Richter的"Advanced Windows"里是详细讲解过的。Top





