当我完成向量时,我需要调用 clear() 吗?
Do I need to call clear() when I am done with a vector?
我看到的所有问题都问到当向量的元素被动态分配/是指针时管理内存。我的问题只是关于已在堆栈上分配的向量,具有简单的类型,例如int
.
如果我有以下代码:
std::vector<int> vec(5);
for(int i = 0; i < vec.size(); i++) {
std::cout << vec[i] << std::endl;
}
完成后我需要打电话clear()
吗?
No.
C++中的类有一个析构函数,当类对象超出范围或删除时,将调用该析构函数。虽然您是正确的,std::vector
动态分配后台空间,但std::vector
析构函数将为您释放内存,从而产生一个快乐的无泄漏程序。
从 cppreference 页面,当向量析构函数被调用时...
破坏容器。调用元素的析构函数,并解除分配使用的存储。请注意,如果元素是指针,则不会销毁指向的对象。
另请注意,从 cpp 首选项上清除,函数...
保持向量的容量()不变...
因此,当您调用clear
时,内存甚至实际上都没有释放!(有关clear
实际在做什么的更多信息,请参阅此SO问题)
如果您担心释放(大)vector
中分配的内存(因此被阻止在其他地方使用),您应该
-
确保相应矢量的范围/生存期限制为其即将使用的区域/时间,以便销毁矢量自动释放内存。
-
如果做不到这一点(无论出于何种原因),您可以
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);
请注意,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
一起保存的内存。
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 在 STL 容器的 STL 容器上调用 clear
- 在从 std::vector 移动的上调用 .clear()、.shrink_to_fit()、.empty() 是否合
- 在向量上调用 clear() 实际上不会删除 data() 中的数据?
- 当我完成向量时,我需要调用 clear() 吗?
- 调用clear()后,向量的元素仍然可以参考
- 在 ifstream 上调用 clear() 有问题吗?
- 我是否应始终在功能末尾调用vector clear()
- 为什么C++ std::list::clear() 不调用析构函数
- set.clear() 在删除元素之前调用所包含元素的析构函数
- 在使用运算符=进行赋值之前,需要调用std::vector.clear()
- STL 容器调用的 Clear() 方法是否删除堆对象
- visual C++ - 调用 std::vector 的 .clear() 时访问违规
- 关于在矢量上调用clear如何改变容量,标准有何规定
- 对shared_ptr的向量调用clear().内存会被释放吗
- c++中对map变量调用clear()函数的要求
- QList clear函数调用是否清除存储在QList中的动态分配对象的内存?
- 分段故障调用std::map::clear
- std::cin循环,即使我调用ignore()和clear()
- std::vector:<T>:clear() 是否调用内容的析构函数?