clear()最常用且安全,销毁元素并置size为0但不释放内存;需彻底释放时应组合shrink_to_fit()或用swap技巧;切勿用erase替代,清空后须用empty()判空再访问。

直接调用 clear() 是最常用且安全的方式
它会销毁所有元素并把 size() 设为 0,但不释放底层内存(capacity() 不变)。适合后续还会往里 push 大量新元素的场景,避免反复分配内存。
示例:
std::vectorv = {1, 2, 3, 4, 5}; v.clear(); // size == 0, capacity 通常仍为 5 或更大
注意:clear() 对含资源的对象(如 std::vector<:string>)会正确调用每个元素的析构函数,不会泄漏。
想彻底释放内存?得手动触发重分配
clear() 不动 capacity(),如果之后长期不用或容器很大,可能浪费内存。此时需配合 shrink_to_fit()(C++11 起):
立即学习“C++免费学习笔记(深入)”;
-
v.clear(); v.shrink_to_fit();—— 推荐组合,语义清晰 - 老标准(C++98/03)可用
std::vector,靠临时对象析构强制归零容量().swap(v);
shrink_to_fit() 是非强制请求,实现可忽略;而 swap 方式 100% 有效,但可读性稍差。
别用 erase(begin(), end()) 替代 clear()
虽然效果一样,但没必要:
- 多打字,语义不如
clear()直观 - 某些编译器优化后等价,但无优势;未优化时还多一次迭代器计算
- 容易写错范围,比如漏掉
end()导致未定义行为
错误示范:
v.erase(v.begin()); // 只删第一个,不是清空
清空后访问元素会崩溃,务必检查 empty()
clear() 后 v[0]、v.at(0)、解引用 v.begin() 都是未定义行为。调试时可能 crash 或返回垃圾值。
安全做法:
- 用
v.empty()判断是否为空,而非依赖size() == 0(虽等价但更习惯) - 迭代前先判空:
if (!v.empty()) { for (auto& x : v) { ... } }
尤其在函数传参或跨模块使用 vector 时,不能默认调用方已清空或未清空。











