c++ - 检查系统中的可用内存以进行新分配

标签 c++ memory-management mingw windows-7-x64

我正在使用 Windows C++ 应用程序处理点云。我们将 PCL 库与 QtOpenSceneGraph 一起使用。计算机有 4 GB 的 RAM。

如果我们加载很多点(例如,40 个点云总共有大约 8 亿个点),系统就会崩溃。

该应用程序几乎没有响应(需要很长时间才能在它周围移动鼠标并且箭头变为一个不断旋转的圆圈)并且在任务管理器的性能选项卡中,我得到了这个输出:

内存(图片中的 1): 增加到 3.97 GB,几乎是系统的总容量。

免费(图中2个): 0

Windos task admin

我检查了这个帖子:herehere使用 MEMORYSTATUSEX 版本,我得到了内存信息。

这里的想法是,在加载更多云之前,检查可用内存。如果我们要加载的云的“重量”大于可用内存,则不要加载它,这样应用程序就不会卡住,并且用户有机会删除较旧的云以释放一些内存。值得注意的是,没有抛出任何异常,我遇到的最糟糕的情况是 Windows 在内存不足时自行终止了应用程序。

现在,这是个好主意吗?有规范的方法来处理这件事吗?

我很高兴听到您对此事的看法。

最佳答案

您的观点与解决类似问题的通常方法不同。

通常,人们可能会分配然后尝试在物理内存中锁定他们需要的空间。 (POSIX 中的 mlock(),WinAPI 中的 VirtualLock())。原因是即使系统此时有足够的可用物理内存,其他一些进程可能会在下一刻产生并将您的驻留集的一部分插入交换空间。

这将要求您使用自定义分配器并确保您的进程有权锁定所需数量的页面。

阅读此处开始:http://msdn.microsoft.com/en-us/library/windows/desktop/aa366895(v=vs.85).aspx

关于c++ - 检查系统中的可用内存以进行新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23683742/

相关文章:

c++ - 为使用Little或Big字节序的计算机编写程序。并且有相同的结果

php - 如何处理 php 中的二进制数据(不是二进制字符串)?

mingw - "cc1plus.exe has stopped working"编译 Boost Spirit 代码时

hibernate - 在 Grails/Tomcat 上的长批处理期间出现 OutOfMemoryError

将多分支树复制到 GPU 内存

c++ - Windows 10 上带有 mingw 的 CMake : Detecting CXX compiler ABI info - failed

visual-studio-2008 - 在 QtCreator 中使用 OpenCV 2.3 和 Qt

c++ - 使用链表或数组进行垄断?

c++ - 阵列无法过早输出一行

java - 如何在java中以低内存且更快的方式迁移和处理数据