c++oding="utf-8" ?>
clear()是最安全的清空方式,将长度设为0但不释放内存,性能开销极小且语义明确;需彻底释放内存时应使用std::string().swap(s)。

直接调用 clear() 是最安全的清空方式
调用 clear() 会把 std::string 的长度设为 0,但不保证释放已分配的内存(容量 capacity() 通常不变)。这是标准、无副作用的做法,适用于绝大多数场景。
- 它不会改变对象地址,不会触发重新分配,性能开销极小
- 后续追加内容时,只要不超过当前
capacity(),就不会再分配内存 - 与
resize(0)效果完全等价,但语义更明确
assign("") 和 = "" 也能清空,但有细微差异
赋值空字符串(s = "")或调用 s.assign("") 同样将长度归零,但底层可能触发小规模重分配(尤其在某些 libstdc++ 实现中,空字符串可能被优化为指向静态空串,导致 capacity() 归零)。
- 语义上不如
clear()直观——你不是想“赋一个空值”,而是想“清空已有内容” - 如果依赖
capacity()不变(比如预分配后反复清空复用),应避免这两种写法 - 在 C++11 及以后,
s = ""通常被优化为等价于clear(),但不可跨标准库实现依赖
别用 erase(0, size()) 清空 string
虽然 s.erase(0, s.size()) 在逻辑上能清空,但它多了一次范围检查和迭代器计算,且可读性差。更关键的是:当 s.size() == 0 时,s.erase(0, 0) 虽然合法,但容易因手误写成 s.erase(0, -1) 或未处理无符号溢出而引发未定义行为。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
size()返回size_t(无符号),s.size() - 1在空串时会绕回极大值,导致erase()崩溃或越界 - 没有理由用这种绕弯写法替代一行
clear()
需要真正释放内存?得手动干预
clear() 不降低 capacity(),如果你确定后续不会再用到这么大容量(比如临时拼接超长日志后想彻底释放),需配合 shrink_to_fit():
s.clear(); s.shrink_to_fit(); // C++11 起支持,但只是建议,实现可忽略
注意:shrink_to_fit() 是非绑定请求,libc++ 通常响应,libstdc++ 在较新版本中也支持,但旧版可能无效。若必须确保释放,唯一可靠方式是交换空临时对象:
std::string().swap(s); // 强制释放所有内存,s.capacity() ≈ 0
这个技巧利用了 move 语义和临时对象析构,是跨平台、可移植的“真清空”。但仅在内存敏感且确认必要时使用——频繁调用反而损害性能。
多数时候,clear() 就够了;真要释放内存,swap() 比 shrink_to_fit() 更靠谱;而 erase() 和手算长度的方式,纯属给自己埋坑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










