编程:实践与原则 - Bjarne Stroustrup
钻进第5章 - 错误
string s = "Success!\n";
for(int i=0;i<100;++i)
cout<<s[i];
打印成功后打印中间有几个空格的随机字符!超出实际的字符串限制。这是为什么?为什么不抛出out_of_bounds异常?
答案 0 :(得分:5)
与Java和类似语言不同,该标准并未规定当数组在其定义的边界之外编入索引时应抛出异常。这样做会导致undefined behavior。不检查索引是否在数组的范围内,可以快速建立索引,但这意味着你必须做一些额外的簿记。
幸运的是,std::string
通过存储字符数组的大小来为您完成此簿记。如果需要在运行时使用边界检查,请使用std::string::at()
。
编辑:如评论中所述,如果您使用at()
来捕获抛出的异常,则几乎总是一个错误。应将异常用于使应用程序处于异常状态的问题。你应该用思维模式编写代码,使得索引越界不应该发生。在将它们传递给string::operator[]
而不是使用string::at()
之前,最好确保没有任何索引超出范围,这是一种拐杖。