vector::clear() 仅将 size 置 0 并析构元素,capacity 不变;彻底清空需用 vector().swap(v),可归零 capacity 且 o(1);shrink_to_fit() 仅为提示,不保证释放内存。

clear() 只清内容不释放内存,swap() 才能真正归零容量
vector::clear() 干了什么?
它把 size() 重置为 0,所有元素调用析构函数,但底层分配的内存(capacity())保持不变。后续 push_back 不会立即触发新内存分配。
常见误用场景:循环中反复 clear() 后又 push 大量数据,导致内存持续占用不降,尤其在长期运行的服务里可能引发隐性内存泄漏。
- 不改变
capacity(),data()指针通常也不变 - 时间复杂度 O(n),n 是当前 size,因为要逐个析构元素
- 对 trivial 类型(如
int、double)析构无实际开销,但语义上仍执行
vector::swap(vector{}) 怎么释放内存?
这是 C++11 起最常用、最可靠的“彻底清空”写法。创建一个空临时 vector,和原 vector 交换内部指针,原 vector 的旧内存随临时对象销毁而释放。
立即学习“C++免费学习笔记(深入)”;
等价但更直观的写法是:vector<int>().swap(v)</int> —— 明确构造空对象并交换。
- 交换后
v.size()和v.capacity()都变为 0 - 只涉及指针交换,O(1) 时间,无元素析构/构造开销
- 注意:不能写成
v.swap({})(C++17 前不支持直接用 braced-init-list 调用 swap)
shrink_to_fit() 是不是更好?
它只是“请求”系统释放多余内存,不保证成功。标准库可忽略该请求,尤其在某些 libstdc++ 实现中,对小容量 vector 常直接返回。
典型现象:v.clear(); v.shrink_to_fit(); 执行后 v.capacity() 仍是原来大小,调试时容易误判。
- 调用后应检查:
if (v.capacity() > v.size()) { /* 未释放 */ } - 底层依赖 allocator 的 reallocate 行为,不可控
- 多线程下无额外优势,且比 swap 多一次潜在分配失败风险
实际选哪个?看场景
高频复用、生命周期长的 vector(比如缓存容器、池化结构),必须用 vector<t>().swap(v)</t>;仅临时清空、很快又要 push 回类似数量的,用 v.clear() 更高效。
别依赖 shrink_to_fit() 做内存清理,它更适合配合 reserve() 做容量微调。
真正需要“归零”的地方,swap 是唯一跨编译器、跨 STL 实现都稳定生效的方式。










