如何删除向量中的元素。 (擦除不起作用)

时间:2012-02-15 07:49:10

标签: c++ windows memory vector erase

当我使用“erase”删除向量中的元素时,则没有清除内存。例如,我创建了一个大小为2000的向量。创建后,程序使用1.5 MB内存。当我进行擦除呼叫时,不会清除任何内容。所有的元素都消失了。但他们仍然在记忆中。

例如:

#include <iostream>
#include <vector>

using namespace std;


int main()
{
    //Makes a vector of 2000 items
    vector<int> test(200000);

    //Pause for test purpose
    system("pause");

    //erase all elements
    test.erase(test.begin(),test.end());

    //Pause for test purpose
    system("pause");

    return false;
}

大小返回0.但是该过程仍然使用1.5MB的内存。

4 个答案:

答案 0 :(得分:11)

进程保留内存有两个原因:

  • std::vector只会在内存增长时重新分配内存,而不是在内存缩小时重新分配。
  • 流程通常会保留释放内存以供重用。

在C ++ 11中,向量具有shrink_to_fit成员函数,如果可能,它将要求向量减少分配的内存量。但是,不能保证会这样做。在C ++ 03中,或者如果你想保证释放多余的内存,你可以使用新分配的向量交换向量的技巧:

std::vector<int>(test).swap(test);

或者如果你想完全清除它:

std::vector<int>().swap(test);

此技巧将分配的内存的所有权移动到临时向量;在表达式的末尾,该向量被破坏,释放内存。

内存是否从进程中释放完全取决于您的库如何管理免费商店。通常,小的分配(可能高达几兆字节)由堆处理 - 该进程从系统请求大块内存,并将它们分成小块。除非已经释放了所有小块,否则无法释放块,即使这样,许多实现也不会释放它们。

可以直接从系统请求更大的分配,在这种情况下,一旦释放它们就会被释放。

所以你可以通过这样的代码得到你期望的效果:

// A few gigabytes will probably be allocated directly.
// You'll have to reduce this on a 32-bit system, or if there's not enough memory
std::vector<int> test(1000000000)

// Use the "swap trick" to ensure the memory is deallocated.
std::vector<int>().swap(test);

但是不能保证即使这样也会从过程中释放内存;内存分配的细节不是由标准指定的,而是由编译器/库实现决定的。

答案 1 :(得分:8)

erase没有释放内存。在标准要求有问题的代码test.capacity() >= 200000之后。使用

test.shrink_to_fit(); // in C++11
vector<int>(test).swap(test); // in C++03

降低矢量的容量。请注意,这仍然不能保证系统其他部分看到的内存使用率会下降。一般来说,这个过程的堆不能减小。

答案 2 :(得分:0)

您可能希望以这种方式进行测试:

int main() 
{ 
    //Makes a vector of 2000 items 
    {
        vector<int> test(200000); 

       //Pause for test purpose 
       system("pause"); 

       //erase all elements 
       test.erase(test.begin(),test.end()); 

       // Call erase or not, but destructor will be called here - freeing all memory
    } 

    //Pause for test purpose 
    system("pause"); 

    return false; 
} 

vector.erase为了简单的目的而不释放内存 - 可能是它已分配的内存的可重用性,而不是为将来的请求重新分配。

答案 3 :(得分:0)

当进程终止时,在您的情况下回收内存。因此,无需删除矢量 如果你想在循环中继续使用向量,那么考虑使用clear()来清除向量的内容。
如果向量在对象中使用,则一旦对象被销毁,则向量也会被破坏 但是,如果向量包含指针,则必须明确删除它们。