考虑以下代码:
class Foo;
std:queue<Foo*> q;
// allocate and add objects to the queue
for (int i=0; i<100000; i++)
{
Foo* f = new Foo();
q.push(f);
}
// remove objects from queue and free them
while (!q.empty())
{
Foo* f2 = q.front();
q.pop();
delete f2;
}
通过单步执行,我可以看到在删除每个对象时调用Foo析构函数,所以我希望每次删除时都会丢弃进程内存使用量 - 但事实并非如此。在我的应用程序中,队列用于生产者/消费者线程,内存使用量不断增长。
我找到恢复内存的唯一方法是每当我弹出所有项目时,将队列换成空队列:
q.swap(std::queue<Foo*>());
如果我使用向量而不是队列,则删除存储的对象会立即丢弃进程内存使用量。任何人都可以解释为什么队列不是那样的行为吗?
编辑以澄清注释:我理解队列管理指针变量本身的内存(即每个指针4或8个字节),并且我无法控制何时 内存被释放。我关心的是指向的堆内存,我通过new和delete管理的内存,也没有按时发布。
*编辑2:似乎只有在调试过程时才会发生..所以实际上并不是一个问题。虽然还很奇怪。
答案 0 :(得分:0)
delete / free的许多实现可能并不总能立即使所有内存再次可用于操作系统 - 内存可能暂时可用于该进程一段时间。因此,如果您正在测量您的RSS或其他东西,您不一定会期望它在删除某些内容的瞬间消失。我认为这种行为在调试模式下可能会有所不同,这可以解释你所看到的内容。