释放存储在std :: queue中的堆指针

时间:2014-11-04 13:37:47

标签: c++ std

考虑以下代码:

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:似乎只有在调试过程时才会发生..所以实际上并不是一个问题。虽然还很奇怪。

1 个答案:

答案 0 :(得分:0)

delete / free的许多实现可能并不总能立即使所有内存再次可用于操作系统 - 内存可能暂时可用于该进程一段时间。因此,如果您正在测量您的RSS或其他东西,您不一定会期望它在删除某些内容的瞬间消失。我认为这种行为在调试模式下可能会有所不同,这可以解释你所看到的内容。