将std::string分配给非终止字符数组时的预期行为
Expected behaviour when assigning std::string to non-terminated char array?
我正在研究其他人开发的C++代码,并发现了一个部分,其中std::string
被分配给不以null结尾的char
数组。代码(简化)如下:
char *filePath="c:\filename.txt"; //file known to contain 20 chars per line.
int size=20;
char *buffer;
std::string bufferstr;
buffer=new char[size];
std::ifstream input(filePath, std::ios::in | std::ios::binary);
input.read(buffer,size);
bufferstr=buffer; // Assign string to non-null-terminated char array.
// Lots of other code omitted here.
input.close();
delete[] buffer;
在使用Dr.memory检查代码时,我发现内存错误并不奇怪,现在我已经更改了这一点,使buffer
始终以null终止,但代码已经出现这个错误大约3年了,并且一直按预期运行(在Windows、Linux和Solaris上),直到我最近对代码中看似无关的部分进行了更改。
我的问题是:
-将std::string
分配给非null端接的char
阵列时,预期的行为是什么
-为什么在我在其他地方做了更改之后,这个代码会开始行为不端?
如果char数组以非null结尾,则结果为UB。可能发生的情况是,字符串构造函数迟早会超出分配的缓冲区并遇到空字节。
- 将std::字符串分配给非null终止的char数组时,预期的行为是什么
std::string将把从接收到的指针到第一个包含零值的地址的所有内容都视为字符串的一部分。通常,这意味着您要么在字符串末尾获得一些垃圾字符,要么获得应用程序核心转储,并出现类似"无法分配"或"访问违规读取"的错误。
- 为什么在我在其他地方做了更改之后,这个代码会开始行为不端
因为你在其他地方的改变,也改变了零所在的位置,在你的非零终止缓冲区末尾附近的内存中(这是一个有根据的猜测)。
相关文章:
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- 使用终止程序的指针在数组中输入字符串
- 如何使用 WIN RPC 发送终止的字符数组(用于将图像从客户端上传到服务器)
- 程序终止,状态为 -1073741510 在 for 循环的中间,将输入分配给二维数组
- 尝试对对象数组进行排序时程序终止
- 为什么具有单独字符的字符数组不像字符串文字那样以 null 终止符结尾?
- 数组下标编译的无效类型'int[int]'由于 -Wfatal 错误而终止
- 空终止未出现在 strcpy-ing 上的数组中
- 我正在尝试计算 char 数组中的内容,直到 null 终止,但每次编译时,我都会得到一个比我的数组大的数字
- Node-ffi 绑定到 NULL 终止的 C 字符串数组,但得到“分段错误:11”
- 哪种语言标准允许忽略固定尺寸数组上的空终止器
- C++ 中 char 数组末尾的空终止符
- 字符星形数组参数未正确终止
- c++当循环在填充数组时没有正确终止时,希望能帮助退出此循环
- 将 char 数组转换为字符串时为零终止
- 程序在大型数组初始化时终止
- 将 char 数组作为参数传递时,为什么索引中不包含 null 终止符?
- #define 个字符数组,C++中没有空终止
- 我如何知道IMAGE_THUNK_DATA数组何时终止
- 调试断言失败错误,字符数组终止为null