当我完成向量时,是否需要调用clear()?

时间:2018-02-28 22:01:18

标签: c++ memory-management

当向量的元素被动态分配/是指针时,我所看到的所有关于管理内存的问题。我的问题只是一个已经在堆栈上分配的矢量,它有一个简单的类型,例如int

如果我有以下代码:

std::vector<int> vec(5);
for(int i = 0; i < vec.size(); i++) {
    std::cout << vec[i] << std::endl;
}

完成后我是否需要致电clear()

2 个答案:

答案 0 :(得分:10)

没有

C ++中的类有一个析构函数,当类对象超出范围或被删除时会被调用。虽然你是正确的std::vector动态分配空间,但std::vector析构函数会为你释放内存,从而产生一个快乐的无泄漏程序。

cppreference page开始,当向量析构函数被调用时......

  

破坏容器。调用元素的析构函数并释放已使用的存储。注意,如果元素是指针,则不会销毁指向的对象。

另请注意,从cppreference上清除,功能......

  

保持向量的容量()不变......

所以当你打电话给clear时,内存实际上并没有被释放! (有关clear实际正在做什么)的更多信息,请参阅this SO question

答案 1 :(得分:6)

如果你担心在(大)vector中释放分配的内存(因此在其他地方被阻止使用),你应该

  1. 确保相应向量的范围/生命周期限于即将使用的区域/时间,以便其销毁自动释放内存。

  2. 失败(无论出于何种原因),你可以

    vec.clear();          // reduces the size to 0, but not the capacity
    vec.shrink_to_fit();  // suggests to reduce the capacity to size
    assert(vec.capacity()==0);
    
  3. 请注意vector::clear()vector中取消分配内存(只有内存,如果有的话,由向量元素动态分配)。 vector::shrink_to_fit()建议将vector的内存占用减少到实际大小,但实现可以选择忽略该请求。

    最后,clear()后跟shrink_to_fit()的替代方法是交换习惯用法(在C ++ 11之前也可以使用):

    vector<Tp>().swap(vec);
    assert(vec.capacity()==0);
    

    这里发生的是构造一个新的空向量(相同类型),然后立即与vec交换,以便vec变为空(零大小和容量)。最后,因为新的向量是一个临时的(未命名的)对象,所以它被破坏,从而取消分配最初保存在vec的内存。