我在看windows API 方面的书,看到内存管理API这部分时,遇到了这些函数。
这些函数查MSDN都能查到,但是,很不理解,堆分配内存和虚拟内存分配内存的区别是什么,这两者的区别是什么。
1.分配虚拟内存
LPVOID WINAPI VirtualAlloc(
  __in          LPVOID lpAddress,
  __in          SIZE_T dwSize,
  __in          DWORD flAllocationType,
  __in          DWORD flProtect
);
2.释放虚拟内存
BOOL WINAPI VirtualFree(
  __in          LPVOID lpAddress,
  __in          SIZE_T dwSize,
  __in          DWORD dwFreeType
);
3.修改虚拟内存页属性
BOOL WINAPI VirtualProtect(
  __in          LPVOID lpAddress,
  __in          SIZE_T dwSize,
  __in          DWORD flNewProtect,
  __out         PDWORD lpflOldProtect
);
1. 为堆分配内存
LPVOID WINAPI HeapAlloc(
  __in          HANDLE hHeap,
  __in          DWORD dwFlags,
  __in          SIZE_T dwBytes
);
2.为堆重新分配内存
LPVOID WINAPI HeapReAlloc(
  __in          HANDLE hHeap,
  __in          DWORD dwFlags,
  __in          LPVOID lpMem,
  __in          SIZE_T dwBytes
);2.为堆释放内存
BOOL WINAPI HeapFree(
  __in          HANDLE hHeap,
  __in          DWORD dwFlags,
  __in          LPVOID lpMem
);
 

解决方案 »

  1.   

    又是望文生义,VirtualAlloc和虚拟内存没有任何关系!去百度一下
      

  2.   

    堆,heap,可以自由分配的内存,对应于栈,stack,由系统自动管理的动态内存区域。然后还有一个global代码,数据区。存放的是一些代码,静态/全局变量。
    上面是从内存的用途来分。程序运行时,可用内存=物理内存+虚拟内存。虚拟内存一般用文件来保存数据,虚拟内存的出现主要是因为以前内存不够(16M的内存刚出来的时候可是天价啊),磁盘相对便宜一些,所以聪明的系统设计者就把设计了虚拟内存,在程序运行的时候把那些很久没有被访问过的(可能以后也不会用到)内存映射到文件里面去(以后需要的时候再读进内存),把内存腾出来给真正需要执行的代码和数据,这样看起来可用内存就比物理内存多了。
    上面是从内存的组成来说的。
      

  3.   

    VirtualAlloc()有两个功能,第一是分配进程的地址空间,每个进程默认的4GB虚拟空间,其主体是空闲的,你需要用去分配。第二是提交物理存储器,这里的物理存储器包括实际的内存+虚拟内存。因为在第一步分配的
    空间中,实际是不存在的,在程序运行时,操作系统会把你在进程分配的空间通过一种映射关系映射到实际的内存中,这一步我们是看不到的,由操作系统完成。数据最终在实际的内存中运算。
    HeapAlloc()是堆分配内存函数,查看c,c++的malloc,new函数的代码,可以看到就是对HeapAlloc()函数的封装,在堆上可以动态分配内存。
    详见《Windows 核心编程》上面说的很清楚