我在C ++中有一个奇怪的矢量问题..
我创建了一个向量并在其中插入了10000个整数值,并检查了内存利用率。它是600 kb。但是在我擦除了矢量之后,我的系统监视器仍然说该程序使用600 kb。
任何人都可以解释为什么即使在我擦除矢量后内存也没有被释放
注意:我已经使用了所有删除方法(erase,pop_front,pop_back,clear ...即便如此我也有同样的问题)
感谢和问候......:)
答案 0 :(得分:9)
据推测,您使用某个系统实用程序检查了内存。即使在堆上释放了向量空间,也不意味着堆空间本身将返回到OS并反映在系统实用程序中显示的值中。
答案 1 :(得分:5)
在std::vector<>
预C ++ 11中真正摆脱未使用内存的唯一方法是将其与空向量交换:vector<int>().swap(myvec)
。在C ++ 11中,你有一个成员函数shrink_to_fit
,它通常被实现为刚刚提到的交换习语。
答案 2 :(得分:2)
C ++向量保留的内存超过其元素所需的内存以加速添加新元素,并且在删除元素后不会释放保留的内存。
您可以尝试自己交换向量,以使保留的内存量与所有元素的实际大小相匹配:v.swap(v)
答案 3 :(得分:0)
尝试删除每个元素,然后删除矢量本身 - 看看是否有任何区别。 您是否尝试使用valgrind来查明是否存在任何内存泄漏?
答案 4 :(得分:0)
尝试使用erase-remove惯用法。如果你只是从向量中删除所有元素,那么你所做的就是移动end()迭代器。因此,矢量中的所有内容仍然存在,但“不可用”。
答案 5 :(得分:0)
以下代码给出了答案:
#include <cstdio>
#include <vector>
struct Foo
{
~Foo()
{
printf("~Foo()\n");
}
};
int main()
{
std::vector<Foo> v;
v.push_back(Foo());
// This causes all Foo instances to be released as well as all
// space allocated by the vector to be released.
v = std::vector<Foo>();
// As you can see, all printf("~Foo()\n") calls happen before this
// line is printed.
printf("~~~~~~~~~~~~~~\n");
return 0;
}