我正在处理一些有点奇怪的情况,但这正是我计划创建的。这只是一种特殊的测试软件...强制Windows释放分配的内存
我的环境: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决定不再有可能进行分配时,我会做更多的事情(根本不依赖任何内存可用性),然后退出范围。它会触发一连串的析构函数,所有这些数据都应该被释放。
This works great。但是我碰巧进入这个奇怪的范围不是一次,而是循环中的10次。它有时会工作2到3次。有时只有一次。下次我只会得到内存不足的错误,就是这样。
从我的角度来看,我需要重新启动整个过程才能真正强制释放内存。有没有一种方法可以在单一过程中实现这一点?
我可以考虑尝试不同的分配器 - 也许这是CRT问题?我也玩过一些堆操作(即低碎片堆),但也没有帮助。
你正在分割堆。这是正常的行为 - “窗户”不会为你留住记忆。你可以直接调用'VirtualAlloc'来完成这个工作。 –
好吧,我分解过程堆,但然后我试图分配完全相同种类的块。在这里我没有看到问题,因为在第一个bad_alloc抛出后没有额外的分配。 – Mickey