将std::string分配给非终止字符数组时的预期行为

Expected behaviour when assigning std::string to non-terminated char array?

本文关键字:数组 终止 string std 分配 字符      更新时间:2023-10-16

我正在研究其他人开发的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将把从接收到的指针到第一个包含零值的地址的所有内容都视为字符串的一部分。通常,这意味着您要么在字符串末尾获得一些垃圾字符,要么获得应用程序核心转储,并出现类似"无法分配"或"访问违规读取"的错误。

  • 为什么在我在其他地方做了更改之后,这个代码会开始行为不端

因为你在其他地方的改变,也改变了零所在的位置,在你的非零终止缓冲区末尾附近的内存中(这是一个有根据的猜测)。