clear() 清空元素但不释放内存,capacity不变;vec = {} 或 swap(std::vector{}) 可彻底释放内存;erase/assign 效果同 clear() 但语义差;清空后 data() 非空仍属未定义行为。

clear() 是最直接的清空方式,但不释放内存
clear() 会销毁所有元素、将 size() 变为 0,但底层分配的内存通常保留(capacity() 不变)。适用于后续还会 push 大量新元素的场景,避免反复分配。
常见误判:调用 clear() 后发现内存没降 —— 这是正常行为,不是 bug。
- 使用场景:循环复用 vector,比如帧数据缓冲区
- 注意:若元素类型有析构逻辑(如含文件句柄、锁等),
clear()会逐个调用析构函数 - 性能影响:O(n) 时间复杂度,n 为当前 size;空间无额外开销
swap + vector{} 彻底释放内存(C++11 起推荐)
想真正归还内存给系统?用 vec.swap(std::vector 或更简洁的 vec = {};(C++11 起支持)。这会触发移动赋值,使原 vector 的 capacity 归零。
错误写法:std::vector 在 C++11 前常用,现在可读性差且无必要。
立即学习“C++免费学习笔记(深入)”;
- 关键点:
vec = {}等价于移动赋值一个空临时对象,标准保证释放内存 - 兼容性:C++11 及以上才安全;C++98/03 请用
std::vector().swap(vec) - 陷阱:若 vector 是 const 成员或被引用绑定,不能赋值;此时需用
swap配合临时对象
erase(begin(), end()) 和 assign(0, T{}) 效果等同 clear(),不推荐
vec.erase(vec.begin(), vec.end()) 和 vec.assign(0, T{}) 都能清空内容,但语义模糊、效率无优势,且容易引发理解偏差。
尤其 assign(0, T{}) 会先构造一个临时 T{},再丢弃 —— 对非 trivial 类型是多余开销。
-
erase版本在调试模式下可能比clear()稍慢(迭代器检查开销) - 二者均不改变 capacity,和
clear()行为一致,但代码意图不如clear()明确 - 除非在极老编译器上
clear()有缺陷(罕见),否则没必要绕路
清空后访问越界:size() 为 0 ≠ data() 为空指针
clear() 或 vec = {} 后,vec.data() 可能仍返回非 null 地址(尤其 capacity > 0 时),但此时访问 vec[0] 或解引用 vec.data() 是未定义行为。
典型崩溃现象:程序偶尔 crash,GDB 显示访问了看似合法的地址 —— 实际是 dangling 指针。
- 安全做法:清空后立即检查
vec.empty(),而非依赖data()是否为 null - 调试建议:开启
-D_GLIBCXX_DEBUG(libstdc++)或_ITERATOR_DEBUG_LEVEL=2(MSVC),让越界访问立刻 abort - 容易忽略:vector 被 move 后,原对象虽为空,但
data()可能失效,不可再用











