我发现malloc得到的内存指针不可以通过GlobalHandle来得到句柄, 返回结果还是指针的值。
下面这几行代码
int main(int argc, char* argv[])
{
char* p1=(char*)malloc(2);
HANDLE hMem=GlobalHandle(p1);
if(NULL==hMem)printf("error:%d\n",GetLastError());
else printf("hMem=%d\n",hMem);
printf("p1=%d,新指针=%d\n",(UINT)GlobalLock(hMem));
return 0;
}
运行的结果是:
hMem=4398480
p1=4398480,新指针=2105145884
Press any key to continue我发现,这个hMem和p1的值是相等的,但是接下来GlobalLock(hMem)却可以返回一个新的指针的值。那么这个新的指针的值又代表了什么内容呢?
为什么和p1不相等?

解决方案 »

  1.   

    malloc和new是通过HeapAlloc来分配的, HeapAlloc分配的是当前进程中Heap管理器管理的内存,这部分内存是进程初始化(或者现有Heap不够用)时通过VirtualAlloc分配的多页虚拟内存
      

  2.   

    new不是很清楚,相信也和malloc一样,具体做法依赖于库的实现。不过最终都是通过系统调用实现的,他们通过适当封装实现了简单的接口。unix下听闻进程只有一个堆,但windows不同,windows下的程序运行时有很多堆。有系统分配的也有程序员主动分配的。Global*函数时早期windows系统的遗留产物吧,它们出现时windows的内存结构和现在的不同,虽然现在保留了这些函数以兼容早期代码,但是意义却变化了,现在的Global*操作的堆是应用程序堆,不再有全局和局部堆之分。一个程序除了有个应用程序堆,如果还是用crt,那么crt还会为自己创建一个名称为_crtheap的堆,它用于crt的内存分配。所以通过malloc分配的内存实际是在_crtheap中分配的,你通过访问应用程序堆的函数无法获得_crt堆中的内存。一个广泛的问题就是:dll分配内存需要在本dll中释放,不然就可能出错。因为有可能有些dll静态链接了crt库,导致程序里出现多个crt堆。不同堆内存不能互相操作。
      

  3.   


    前两天有个类似帖子,说HeapAlloc VirtualAlloc区别的,可以搜索看~