各位好!
我用virtualalloc函数分配内存时,出现‘存储空间不足,无法处理此命令’异常提示,如何处理?
是不是系统出现内存泄漏,可是我的内存有2G,才用了2、3百M,而且虚拟内存也设了1G。

解决方案 »

  1.   

    用GetLastError获得分配失败的原因看看
      

  2.   

    谢谢各位!
    用GetLastError得到8,查询后就是‘存储空间不足,无法处理此命令’。另外c盘的各个盘的空间都足够大的。
      

  3.   

    如果你是用virtualalloc函数在HeapCreate新建出来的堆的地址内分配内存的话,有可能导致无法分配超过524280个字节的内存块,这时的解决方法是HeapCreate函数新建堆的时候,里面的第三个参数改为0试试。
    你可先用virtualalloc分配524279个字节看能否成功,如果这时没有错误,而分配524281个字节就出错的话说明我的猜测是对的,把HeapCreate函数里面的第三个参数改为0就行了。
      

  4.   

    Snow_Ice11111(雪上加冰),你好!
    实际上我只是用virtualalloc分配1k的内存,没有设计HeapCreate函数,但是也会失败。下面是代码:
    PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,1024,MEM_COMMIT,PAGE_READWRITE)我的程序是作为中间件运行,处理socket连接的。每当一个socket联上来,就根据数据量分配一块内存,当io处理完毕,就用virtualfree函数释放内存。现在是当处理到1万5000多个连接时,就会出现分配内存失败的情况。
      

  5.   

    我不清楚为什么分配1k这么小的内存也会失败!不过后来我看到程序运行时,虚拟内存一直在增加,当它达到190几M的时候,分配失败就出现了。我不知道是不是virtualfree函数没有执行成功所致,还是有其它原因。
      

  6.   

    可是virtualfree函数执行成功没有很好判断啊,看它的返回值就行了,再加一行:pNewBuffer=NULL,这样就保险了。帮你顶了,看其他人怎么说。我再想想是否有其它可能的情况,先睡了^_^
      

  7.   

    昨天仔细看了一下书上对VirtualAlloc()和VirtualFree()函数的用法://在地址空间中保留一个区域
    PBYTE pNewBuffer = (PBYTE) VirtualAlloc(NULL,1024,MEM_RESERVE,PAGE_READWRITE);
    //提交物理存储器
    VirtualAlloc(pNewBuffer,65536,MEM_COMMIT,PAGE_READWRITE);......//回收提交的物理存储器
    VirtualFree(pNewBuffer,65536,MEM_DECOMMIT);
    //释放已保留的区域
    VirtualFree(pNewBuffer,0,MEM_RELEASE);上面的代码是示例,要结合你的问题情况来分析的话,还请贴上和VirtualAlloc()和VirtualFree()函数有关的代码。