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

Fal*_*Ali 5 c++ memory-management

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

如果我有以下代码:

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

我完成后需要打电话clear()吗?

sco*_*001 10

没有.

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

cppreference页面,当向量析构函数被调用时...

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


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

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

所以当你打电话时clear,内存实际上甚至没有被释放!(有关实际行动的更多信息,请参阅此SO问题clear)


Wal*_*ter 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);
    
    Run Code Online (Sandbox Code Playgroud)

请注意,vector::clear()vector(仅由内存中,如果有的话,由向量元素动态分配)中取消分配内存.vector::shrink_to_fit()建议将内存占用量减少vector到实际大小,但实现可以选择忽略该请求.

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

vector<Tp>().swap(vec);
assert(vec.capacity()==0);
Run Code Online (Sandbox Code Playgroud)

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