C++ 如何从std::deque释放内存?

C++ 如何从std::deque释放内存?,c++,stl,deque,C++,Stl,Deque,我使用std::deque来存储相当多的对象。如果我移除一堆这些对象,在我看来,它的内存使用并没有减少,这与std::vector的方式类似 有没有办法减少它?我知道在一个向量中,你必须使用“交换技巧”,我想在这里也可以,但我宁愿避免,因为它需要复制容器中的所有元素(因此需要有足够的内存来存储每个对象两次)。我对deque的实现不是很熟悉,但我的理解是,在没有大量副本的情况下,可能实现这样的事情(而使用向量显然不是) 如果有什么不同的话,我使用的是VC++(Dinkumware)STL。在std

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

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


如果有什么不同的话,我使用的是VC++(Dinkumware)STL。

在std::deque中无法直接实现这一点。但是,使用临时变量很容易做到(这基本上就是std::vector中缩减容量时发生的情况)


下面是一个例子,将其与std::vector进行比较。最底部显示了一种交换和收缩向量的干净方法,这与deque的工作原理相同。

deque的内存大小可能会缩小,也可能不会缩小。这种情况何时发生以及如何发生取决于具体的实现。不幸的是,您没有太多的手动控制,因为deques甚至没有容量()或储备()

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


deque内存管理的详细知识可能会从Dikum网站上获得(这是您当前的实现,对吗?

std::deque会将内存返回到其分配器。此分配器通常不会将内存返回到操作系统。在这种情况下,内存似乎没有被“释放”。良好的内存泄漏检测器将在内存返回分配器后立即满足要求,并了解并非所有内存都是通过
free()

释放的,因为添加了以下信息:


在C++0x/C++11中,deque(和其他几个容器)有一个名为“收缩到适合”的新函数,它将删除多余的项,并基本上对齐容量()==size()

您确定deque实现没有在删除足够的项以清空它们时释放内存块吗?或者你真的想通过在每一端重新分配块来压缩最后的几个字节吗?我想是这样的,用一种相当粗略和现成的方式:我添加100000项->内存使用量约为90MB。我又增加了100000->内存使用量约为170MB。我删除100000个项目->内存使用量仍然是~170MB。再增加100000->仍然是170。我假设100000个项目就足够了,它将有空块,如果它要释放这些空块,它会释放这些空块。进程的内存使用率,还是集合的内存使用率?仅仅因为集合释放了内存并不意味着它会返回到操作系统,所以请在删除这些项后尝试分配80MB的字符数组,看看使用量是达到250MB,还是保持在170。抱歉,如果你已经知道所有这些东西,并且已经解释了它-数百万人不会。还请注意,我真的不知道会发生什么-我只是不知道如何特别纯粹或图书馆一般管理德克记忆。只要有人出现,你就可以放心地忽略我:-)注意到单个80MB字符数组过于简单化,因为即使deque释放了内存,也可能会留下零碎的可用空间。所以,我建议的测试仍然不能证明deque仍然保留着记忆,抱歉。晚上很晚了。你将不得不进行一个相当小的分配,以证明你的应用程序无法利用空闲时间。可能使用第二个deque而不是普通数组来获得可比较的分配模式。或者检查在标题中有多少dinkum的实现是可见的。谢谢。我怀疑可能没有任何方法可以做到这一点,但似乎这应该是可能的。。。我在问题中解释了为什么我不愿意在这种情况下使用swap,但不管怎样,我可能不得不研究它。在这种情况下,您只创建引用的副本,而不是所有元素及其内存的副本。这通常是很小的。交换的东西只交换向量的内部指针,而不是元素本身。容量()在收缩到适合()后仍然可以高于大小()-这是一个非绑定请求<实际上,code>void shrink_to_fit(){}是一个完全合法的实现。但是,即使有一个好的实现,capacity()也可能高于size(),例如,如果容器中的元素太少,可能仍然值得分配更多内存。(想想空容器。)