Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法释放由C+;中的CreateFileMapping和MapViewOfFile创建的共享内存+; 我正在学习用C++共享内存工作。我发现在Windows下,我需要使用CreateFileMapping和MapViewOfFile函数。我想共享字符数组,因此我的部分代码是: HANDLE hBuffer = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, bufferName); char * buffer = (char *) MapViewOfFile(hBuffer, FILE_MAP_ALL_ACCESS, 0, 0, size);_C++_Shared Memory - Fatal编程技术网

无法释放由C+;中的CreateFileMapping和MapViewOfFile创建的共享内存+; 我正在学习用C++共享内存工作。我发现在Windows下,我需要使用CreateFileMapping和MapViewOfFile函数。我想共享字符数组,因此我的部分代码是: HANDLE hBuffer = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, bufferName); char * buffer = (char *) MapViewOfFile(hBuffer, FILE_MAP_ALL_ACCESS, 0, 0, size);

无法释放由C+;中的CreateFileMapping和MapViewOfFile创建的共享内存+; 我正在学习用C++共享内存工作。我发现在Windows下,我需要使用CreateFileMapping和MapViewOfFile函数。我想共享字符数组,因此我的部分代码是: HANDLE hBuffer = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, size, bufferName); char * buffer = (char *) MapViewOfFile(hBuffer, FILE_MAP_ALL_ACCESS, 0, 0, size);,c++,shared-memory,C++,Shared Memory,(当然还有空值检查)在使用共享内存结束时,我调用: UnmapViewOfFile(buffer); // returned true CloseHandle(hBuffer); // returned true also 但在资源监视器中,我可以看到并没有释放内存。当它被多次调用时,应用程序的分配内存会增加,但不会释放。我做错了什么?或者是否有其他功能来释放共享内存 感谢您的回答。问题的解决多亏了marcin_j: 您的代码看起来可以使用 从sysinternals中获取procep.exe

(当然还有空值检查)在使用共享内存结束时,我调用:

UnmapViewOfFile(buffer); // returned true
CloseHandle(hBuffer); // returned true also
但在资源监视器中,我可以看到并没有释放内存。当它被多次调用时,应用程序的分配内存会增加,但不会释放。我做错了什么?或者是否有其他功能来释放共享内存


感谢您的回答。

问题的解决多亏了marcin_j:

您的代码看起来可以使用 从sysinternals中获取procep.exe以按名称查找句柄(如果是 未找到,然后关闭),也请在“性能”选项卡上观察如何操作 你的应用程序的虚拟大小改变了,还有一个句柄数 应该相应地改变


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


我上面的评论是错误的,CreateFileMapping默认适用 提交内存的SEC_COMMIT。但我想你的记忆被翻页了 在调用memset之前,在调用之后,分页页面将移动到 物理内存,它上升到工作集。。。。如果我没有错


您在资源监视器中的读数是多少?您正在查看提交大小还是工作集大小?只有在所有访问内存的应用程序释放/关闭其句柄后,才会释放内存。。例如,两个应用程序映射共享一个内存映射。一个应用程序关闭其句柄,内存映射将一直存在,直到第二个应用程序执行相同的操作。您的代码看起来是find(好吧,…您错放了句柄),您可以使用sysinternals中的procexp.exe按名称查找您的句柄(如果未找到,则它已关闭),还可以在“性能”选项卡上观察应用程序的虚拟大小如何变化,还有一个句柄计数应该相应地改变。另外,观察执行
memset(buffer,0,size)后会发生什么MapViewOfFile之后-这实际上是系统提交内存的时间,以及您的工作集上升的时间。我上面的评论是错误的,CreateFileMapping默认应用提交内存的SEC_提交。但我想在调用memset之前,内存是分页的,在调用之后,分页的页面被移动到物理内存中,物理内存上升到工作集。。。。如果我没有错。。。