我正在观察字符串操作的一些奇怪行为.
例如:
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 []时,有人可以解释它在内存级别的工作原理.
欢迎来到C++的惊人吸引力,称为"未定义的行为".
当name包含六个字符的字符串"ABCDEF"时,会name[8]尝试访问字符串中不存在的成员,这是未定义的行为.
这意味着此操作的结果完全没有意义.
C++标准没有定义访问字符串中不存在的成员字符的结果; 因此未定义的行为.此操作的潜在结果可能是:
在给定位置的字符串中的某个先前值.
一些垃圾,随机字符.
你的程序崩溃了.
还要别的吗.
每次执行程序时都会有不同的结果,从选项1到4中选择.