我正在学习使用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
但在资源监视器中我可以看到没有释放内存。当它被多次调用时,应用程序的分配内存正在增加,但是没有释放。我究竟做错了什么?或者是否有其他功能来释放共享内存?
感谢您的回答。
答案 0 :(得分:0)
感谢marcin_j解决了问题:
你的代码看起来很好(好吧,......你拼错了HANDLE),你可以使用 来自sysinternals的procexp.exe按名称查找你的HANDLE(如果是的话) 没有找到然后它被关闭),也在Performance选项卡上观察如何 你的应用程序的虚拟大小发生了变化,还有Handles计数 应该相应改变。
另外,观察执行后会发生什么 memset的(缓冲液,0,大小);在MapViewOfFile之后 - 这实际上是在什么时候 系统将提交内存,当你的工作集上升时。
我的上述评论错误,默认情况下CreateFileMapping适用 提交内存的SEC_COMMIT。但我想你的记忆是被分页的 在调用分页页面之后调用memset 物理记忆,如果我没有错,就会提高工作水平......