用c_str()直接赋值给char*是错误的,因其返回只读指针且生命周期依赖string对象;正确做法是自行分配足够空间(length()+1)后复制内容,并优先使用raii管理内存。

用 c_str() 直接赋值给 char* 是错的
很多人看到 std::string::c_str() 返回 const char*,就想着强转成 char* 然后 memcpy,结果运行时崩溃或后续写入越界。根本原因是:c_str() 指向的是 string 内部只读缓冲区,不能写;而且生命周期绑定 string 对象——string 析构或重分配后,指针立刻失效。
正确做法:先分配足够空间,再用 strcpy 或 memcpy
必须自己申请可写的内存,并确保容量 ≥ str.length() + 1(留出 '\0')。常见错误是只分配 str.length() 字节,漏掉结尾空字符。
- 用
new char[str.length() + 1]分配,然后strcpy(dst, str.c_str()) - 或用
std::vector<char> buf(str.length() + 1); memcpy(buf.data(), str.c_str(), str.length() + 1);</char> - 如果目标缓冲区已存在(比如函数参数传入的
char* dst),务必确认其大小 ≥str.length() + 1,否则用strncpy(dst, str.c_str(), size - 1); dst[size-1] = '\0';
data() 和 c_str() 在 C++11 后的区别
C++11 起,std::string::data() 也返回 const char*,语义和 c_str() 完全一致(都保证以 '
C++11 起,std::string::data() 也返回 const char*,语义和 c_str() 完全一致(都保证以 '\0' 结尾);C++17 后 data() 可返回非 const 指针(仅当 string 非 const 且未被 const 引用持有),但直接写入仍不安全——标准不保证内部缓冲区可写,且可能触发 copy-on-write(虽多数实现已弃用)。
data() 可返回非 const 指针(仅当 string 非 const 且未被 const 引用持有),但直接写入仍不安全——标准不保证内部缓冲区可写,且可能触发 copy-on-write(虽多数实现已弃用)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 永远别对
str.data()做 const_cast 后写入 - 需要可写缓冲区,就必须显式分配新内存
- 若只是临时读取,优先用
c_str(),语义更明确
避免内存泄漏:记得 delete[] 或用 RAII
手动 new char[] 后忘记 delete[] 是常见 bug。更稳妥的方式是用 std::vector<char></char> 或 std::unique_ptr<char></char> 管理生命周期:
std::unique_ptr<char> buf(new char[str.length() + 1]); strcpy(buf.get(), str.c_str());</char>
或者直接用 std::string 本身——很多场景其实不需要裸 char*,强行转换反而引入风险。
真正难的不是复制动作本身,而是判断“为什么非要 char*”:是调用旧 C API?还是跨线程传递?这些上下文决定了缓冲区该谁释放、生命周期怎么对齐——漏掉这点,代码早晚出问题。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










