为什么我不应该使用 std::string.c_str() 作为缓冲区?
Why shouldn't I use std::string.c_str() as a buffer?
虽然这可能是一个愚蠢的问题,但我看到了一些关于你不应该这样做的东西,尽管事实上它在 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;
- 返回:一个指针 p,使得 p + i == &运算符对于 [0,size((] 中的每个 i。
- 复杂度:恒定时间。
- 要求:程序不得更改字符数组中存储的任何值。
除此之外,您正在通过const char *
修改数据引用,这通常表示const_cast<char*>
。这不仅会导致未定义的行为,而且根据 Herb Sutter 的说法const
现在应该被解读为线程安全的(参见他关于const
和mutable
的谈话(。
但是,如前所述,如果str
足够大,则使用std::string str; &str[0]
是安全的。只是不要使用.c_str()
或.data()
.
相关文章:
- C++字符*缓冲区的大小
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 多线程双缓冲区
- Android P-9.0.0_r53 Logcat主缓冲区超出定义大小
- 套接字读取后,我在缓冲区中看到意外输入
- Python str to C++ to Python str
- std::带有自定义缓冲区的 iostream 不允许我写入
- 从返回的顶点缓冲区查询顶点结构
- Vulkan 中的动态顶点缓冲区格式设置
- OpenGL 16 位模板缓冲区?
- 无法将缓冲区 [200] 转换为 str[]
- 写入 &str[0] 缓冲区(标准:字符串)在 C++11 中是否定义明确的行为?
- c++:以std::string (&str[0])作为缓冲区安全地读取文件