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

时间:2015-07-01 06:16:44

标签: c++ arrays string

我正在研究其他人开发的C ++代码,并找到了一个std::string被分配给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始终以空值终止,但代码出现此错误3年,并且在我最近对代码中看似无关的部分进行了更改之前,已经按预期行事(在Windows,Linux和Solaris上)。

我的问题是:
- 将std::string分配给非空终止char数组时的预期行为是什么?
- 为什么在我在其他地方做出更改之后,这段代码才开始行为不端?

2 个答案:

答案 0 :(得分:1)

如果char数组非空终止,则结果为UB。可能发生的是字符串构造函数将超出分配的缓冲区并迟早会遇到空字节。

答案 1 :(得分:0)

  
      
  • 将std :: string分配给非以null结尾的char数组时的预期行为是什么?
  •   

std :: string将考虑从接收到的指针到包含零值的第一个地址的所有内容,成为字符串的一部分。通常,这意味着您要么在字符串末尾获得一些垃圾字符,要么获得应用程序核心转储,并出现类似"无法分配"的错误。或者"访问违规阅读"。

  • 为什么在我在其他地方做出更改之后,这段代码才开始行为不端?

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