我在这里处理了一个有点奇怪的场景,但这正是我计划创建的。它只是一种特殊的测试软件......
我的环境: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
}
我需要使用尽可能多的内存。我一次分配整个页面(也许这很糟糕,应该为双端队列/智能 ptr 的数据留出一些空间?)。当 CRT 决定不能再分配时,我会做更多的事情(根本不依赖任何内存可用性),然后退出范围。它将触发析构函数链,所有这些数据都应该被释放。
这很好用。但我碰巧在一个循环中进入这个奇怪的范围不是一次而是 10 次。它有时会工作 2 或 3 次。有时只有一次。下次我只会得到内存不足的错误,就是这样。
从我的角度来看,我需要重新启动整个过程才能真正强制释放内存。有没有一种方法可以在单个过程中实现这一目标?
我可以考虑尝试不同的分配器——也许是 CRT 问题?我也玩了一点堆操作(即低碎片堆),但也没有帮助。