如何正确释放或删除c ++向量?

时间:2011-12-17 16:42:03

标签: c++

我在C ++中有一个奇怪的矢量问题..

我创建了一个向量并在其中插入了10000个整数值,并检查了内存利用率。它是600 kb。但是在我擦除了矢量之后,我的系统监视器仍然说该程序使用600 kb。

任何人都可以解释为什么即使在我擦除矢量后内存也没有被释放

注意:我已经使用了所有删除方法(erase,pop_front,pop_back,clear ...即便如此我也有同样的问题)

感谢和问候......:)

6 个答案:

答案 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()迭代器。因此,矢量中的所有内容仍然存在,但“不可用”。

http://en.wikipedia.org/wiki/Erase-remove_idiom

答案 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;
}