如何从std :: deque中释放内存?

时间:2009-08-07 00:58:20

标签: c++ stl deque

我正在使用std::deque来存储相当多的对象。如果我删除了一堆这些对象,在我看来它的内存使用量并没有减少,与std :: vector类似。

有没有办法减少它?我知道在矢量中你必须使用'交换技巧',我认为它也适用于此,但我宁愿避免使用它,因为它需要复制容器中剩下的所有元素(因此需要你有足够的内存来存储每个对象两次)。我并不熟悉deque的实现,但我对它的理解是,有可能在没有大量副本的情况下实现这样的事情(而使用矢量显然不是这样)。

我正在使用VC ++(Dinkumware)STL,如果这有任何区别的话。

4 个答案:

答案 0 :(得分:15)

无法直接在std :: deque中执行此操作。但是,通过使用临时(这基本上是在缩小容量时在std :: vector中发生的事情)很容易做到。

这是一个good article on std::deque,将它与std :: vector进行比较。最底部显示了一种交换和收缩矢量的简洁方法,它与deque一样。

答案 1 :(得分:4)

双端队列的内存大小可能会缩小,也可能不会缩小。 如何这种情况发生时是特定于实现的。不幸的是,你没有太多的手动控制,因为deques缺乏甚至容量()或保留()。

如果确实检测到内存释放没有在您方便时执行,我建议使用swap()。

可能会从Dikum网站获得对deque内存管理的深入了解(这是您当前的实现,对吗?)

答案 2 :(得分:4)

作为补充信息:

在C ++ 0x / C ++ 11中,deque(以及其他几个容器)有一个名为“shrink_to_fit”的新函数,它将删除多余的项目并基本对齐capacity()== size()

答案 3 :(得分:1)

std :: deque会将内存返回给其分配器。这个分配器通常不会将内存返回给操作系统。在这种情况下,看起来好像内存没有“释放”。一旦内存返回到分配器,就会满足好的内存泄漏检测器,并了解并非所有内存都由free()释放。