无法在C ++中释放由CreateFileMapping和MapViewOfFile创建的共享内存

时间:2014-02-05 21:32:42

标签: c++ shared-memory

我正在学习使用C ++中的共享内存。我发现在Windows下我需要使用CreateFileMapping和MapViewOfFile函数。我想共享char数组,所以我的部分代码是:

HANDLE hBuffer = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, bufferName);
char * buffer = (char *) MapViewOfFile(hBuffer, FILE_MAP_ALL_ACCESS, 0, 0, size);

(当然有检查NULL)并且在使用共享内存结束时我调用:

UnmapViewOfFile(buffer); // returned true
CloseHandle(hBuffer); // returned true also

但在资源监视器中我可以看到没有释放内存。当它被多次调用时,应用程序的分配内存正在增加,但是没有释放。我究竟做错了什么?或者是否有其他功能来释放共享内存?

感谢您的回答。

1 个答案:

答案 0 :(得分:0)

感谢marcin_j解决了问题:

  

你的代码看起来很好(好吧,......你拼错了HANDLE),你可以使用   来自sysinternals的procexp.exe按名称查找你的HANDLE(如果是的话)   没有找到然后它被关闭),也在Performance选项卡上观察如何   你的应用程序的虚拟大小发生了变化,还有Handles计数   应该相应改变。

     

另外,观察执行后会发生什么   memset的(缓冲液,0,大小);在MapViewOfFile之后 - 这实际上是在什么时候   系统将提交内存,当你的工作集上升时。

     

我的上述评论错误,默认情况下CreateFileMapping适用   提交内存的SEC_COMMIT。但我想你的记忆是被分页的   在调用分页页面之后调用memset   物理记忆,如果我没有错,就会提高工作水平......