在VC环境下调用 VirtualFree函数,传递MEM_RELEASE|MEM_DECOMMIT参数,
与调用VirtualAlloc函数,传递MEM_RESET参数
两者之间有什么区别吗
另外ZeroMemory函数的作用是什么,一般在什么时候用到?
分不多了,如果哪位大侠能不吝赐教的话,我就再开帖给分

解决方案 »

  1.   

    ZeroMemory是使某段内存的内容都清0
      

  2.   

    The ZeroMemory function fills a block of memory with zeros.To avoid undesired effects of optimizing compilers, use the SecureZeroMemory function.void ZeroMemory(
      PVOID Destination,
      SIZE_T Length
    );
      

  3.   

    ZeroMemory函数的清0操作也是以系统的页面大小为单位的吗?比如在X86系列计算机上,即使为Length
    传递1,那么也要清除4KB大小的RAM?还有什么情况下要使用ZeroMemory?
    ///////////////////////////////////////////////////////////////////////////////////////
     VirtualFree函数大家应该常用的吧,传递MEM_RELEASE|MEM_DECOMMIT参数,表示释放系统页文件和RAM,我是这样理解的
    为VirtualAlloc函数的第三个参数传递MEM_RESET参数,表示清除RAM(只在WIN2000下可行)
    我有点搞不清楚,这两种方式有什么不同。是否我对WINDOWS内存管理还不够了解。
    ///////////////////////////////////////////////////////////////////////////////////////
    我理解 RAM是系统页文件的一部分。因此RAM的内容和系统页文件是不重复的。
     
      

  4.   

    ZeroMemory函数的清0操作也是以系统的页面大小为单位的吗?比如在X86系列计算机上,即使为Length
    传递1,那么也要清除4KB大小的RAM?还有什么情况下要使用ZeroMemory?
    -----------
    当然不是。它不过就是调用memset(p,0,len)而已。VirtualAlloc(MEM_RESET)与 VirtualFree(MEM_RELEASE|MEM_DECOMMIT)是完全不同的意思。MEM_DECOMMIT是释放已经分配的内存,MEM_RELEASE是释放系统分配给你的一片内存地址(只有地址,没有内存)。MEM_RESET的用途,据我理解是这样的:当系统内存不足时,需要将某些页面保存至硬盘中的虚拟内存文件中;为了提高系统性能、节省一次写磁盘的操作,对于那些并不重要的内存,我们可以用MEM_RESET告诉系统不必保存它了,它不再有用。但是调用过MEM_RESET之后,我们还是可以对这块内存操作,它还是属于我们的。操作过之后,上一次调用的MEM_RESET就失效了。
      

  5.   

    Windows的地址空间有三种状态。一种是COMMITED,表明该地址空间以和一块内存相联系;一种是RESERVED,表明该地址空间虽未与一块内存相联系但今后可能会用到,需要保留;一种是FREE,表明该地址空间与内存没有联系。VirtualFree(MEM_RELEASE|MEM_DECOMMIT)的意思是将某块地址空间(无论是COMMITED的还是RESERVED的)全都改为FREE的。VirtualAlloc(MEM_RESET)的作用是通知系统,某块内存不再重要,当内存不足时不再需要将其保存至虚拟内存文件中。也就是说,调用完VirtualAlloc(MEM_RESET)后,该块内存的内容不一定能保持,但该内存地址依然存在,今后可对其再操作。
      

  6.   

    谢谢楼上的诸位大侠,尤其是关于ZeroMemory函数的说明------不过就是调用memset(p,0,len)而已
    非常精辟。
    无以为报,惟有赠分