std :: string assign,clear和operator []的奇怪行为

Sit*_*esh 2 c++ string clear

我正在观察字符串操作的一些奇怪行为.

例如:

int main()
{
  std::string name("ABCDEFGHIJ");

  std::cout << "Hello, " << name << "!\n";
  name.clear();
  std::cout << "Hello, " << name << "!\n";
  name.assign("ABCDEF",6);
  std::cout << "Hello, " << name << "!\n";
  std::cout << "Hello, " << name[8] << "!\n";
}
Run Code Online (Sandbox Code Playgroud)

输出:

Hello, ABCDEFGHIJ!
Hello, !
Hello, ABCDEF!
Hello, I!
Run Code Online (Sandbox Code Playgroud)

string :: clear实际上没有清除,因为即使清除后我也能访问数据.根据文档,当我们访问超出范围的东西时,结果是未定义的.但在这里,我每次都得到相同的结果.当我们调用clear或opeartor []时,有人可以解释它在内存级别的工作原理.

Sam*_*hik 8

欢迎来到C++的惊人吸引力,称为"未定义的行为".

name包含六个字符的字符串"ABCDEF"时,会name[8]尝试访问字符串中不存在的成员,这是未定义的行为.

这意味着此操作的结果完全没有意义.

C++标准没有定义访问字符串中不存在的成员字符的结果; 因此未定义的行为.此操作的潜在结果可能是:

  1. 在给定位置的字符串中的某个先前值.

  2. 一些垃圾,随机字符.

  3. 你的程序崩溃了.

  4. 还要别的吗.

  5. 每次执行程序时都会有不同的结果,从选项1到4中选择.

  • @Sitesh当然`[]`比`at()`提供更好的性能,正是因为它没有边界检查.这也是它存在的原因.C++为您提供了不支付您不需要的费用的选项. (2认同)