为什么我不应该使用 std::string.c_str() 作为缓冲区?

Why shouldn't I use std::string.c_str() as a buffer?

本文关键字:str 缓冲区 不应该 string std 为什么      更新时间:2023-10-16

虽然这可能是一个愚蠢的问题,但我看到了一些关于你不应该这样做的东西,尽管事实上它在 C++ 11 中是允许的,但我不太明白为什么。谁能解释为什么会这样?

这是

不允许的!

21.4.7 basic_string字符串操作[string.ops]

21.4.7.1 basic_string 访问器[字符串.访问器]

const charT* c_str() const noexcept;
const charT* data() const noexcept;
  1. 返回:一个指针 p,使得 p + i == &运算符对于 [0,size((] 中的每个 i。
  2. 复杂度:恒定时间。
  3. 要求:程序不得更改字符数组中存储的任何值。

除此之外,您正在通过const char *修改数据引用,这通常表示const_cast<char*>。这不仅会导致未定义的行为,而且根据 Herb Sutter 的说法const现在应该被解读为线程安全的(参见他关于constmutable的谈话(。

但是,如前所述,如果str足够大,则使用std::string str; &str[0]是安全的。只是不要使用.c_str().data().