c++ - 强制 Windows 释放分配的内存

标签 c++ windows memory memory-management free

我正在处理一个有点奇怪的场景,但这正是我计划创建的。它只是一种特殊的测试软件...

我的环境:MSVS 2012,Windows 7/8 32b/64b。

因此,首先我创建了一些内部结构/缓冲区/等以在我的应用程序中使用,然后我正在做这样的事情(这里稍微简化了一点,请将其视为伪代码):

{
   std::deque<boost::scoped_array<unsigned char>> deque;
   try {
     while (1) {
       deque.push_back(boost::scoped_array<unsigned char>(new unsigned char[system_page_size])); // happens to be 4096 on my system
     }
   }
   catch (std::bad_alloc& ex) { ... }
   // do something here
}

我需要使用尽可能多的内存。我一次分配整个页面(也许这不好,应该为 deque/smart ptr 的数据留出一些空间?)。当 CRT 决定不能再分配时,我会做更多的事情(根本不依赖任何内存可用性),然后退出作用域。它将触发析构函数链,所有这些数据都应该被释放。

这很好用。但是我碰巧进入这个奇怪的范围不是一次而是循环10次。它有时会工作 2 或 3 次。有时只有一次。下次我只会得到内存不足的错误,仅此而已。

从我的角度来看,我需要重新启动整个过程才能真正强制释放内存。有没有一种方法可以在单个进程中实现这一点?

我可以考虑尝试不同的分配器 - 也许是 CRT 问题?我也玩过一些堆操作(即低碎片堆),但也没有帮助。

最佳答案

为什么不用一些大的 VirtualAlloc 来保留你进程的整个内存空间呢?使用 MEM_RESERVE 调用。然后您稍后会在每个内存范围上调用 VirtualFree 以释放。这仍然需要一些堆分配,就像您在此处所做的那样,以耗尽当前堆的其余部分。它会更快并消除您必须遇到的页面文件流失。

至于你的具体问题,我不知道你为什么会遇到它。保留所有内存以使堆无法扩展应该有助于减少不确定性。

关于c++ - 强制 Windows 释放分配的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076642/

相关文章:

c++ - Windows 函数中的 char* 或 LPCWSTR

windows - Windows CMD 文件中提示管理员访问的示例

c# - 防止 C# 应用进程终止

jQuery 存储 session 数据

linux - 谁能告诉我获取当前最大大小以将对象存储在 Memcached 中的命令

c++ - vector<unique_ptr> 上的 is_copy_constructible 误报

c++ - 创建并迭代使用两个字符串作为键的多重映射

c# - 随机对象在后续调用中变得非随机?

c++ - 在 C++ 中类似 Python 的静态数据存储?

c# - 无法检查新目录上的 'Include inheritable permissions'