核心内容摘要
乘风破浪,中国“X战”:一场席卷全球的科技与文化风暴
提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档文章目录结论原因Qt 对 chop 做了边界安全处理代码示例验证补充QString 其他函数的边界行为结论QString::chop(int n) 不会因为字符串为空、或字符串长度小于n而崩溃。
当字符串长度小于n包括空字符串时chop(n)会直接将字符串清空等价于调用clear()只有当n ≤ 0时chop会直接返回不做任何操作。
原因Qt 对chop做了边界安全处理QString::chop的底层实现会先计算新的字符串长度newLen qMax(0, length() - n)再通过truncate(newLen)截断字符串。
由于qMax(0, ...)保证了newLen不会是负数因此不会出现越界访问自然不会崩溃。
以 Qt 5/6 的源码为例chop的核心实现如下voidQString::chop(intn){if(n
return;// n≤0时直接返回不操作constintnewLengthqMax(0,size()-n);// 保证新长度≥0truncate(newLength);// 截断到新长度安全操作}代码示例验证#includeQCoreApplication#includeQString#includeQDebugintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);// 场景1空字符串调用chop(
QString str1;str
chop(
;qDebug()空字符串chop(
结果str1;// 输出仍为空// 场景2字符串长度小于5长度3QString str2abc;str
chop(
;qDebug()长度3的字符串chop(
结果str2;// 输出被清空// 场景3正常情况长度8QString str3abcdefgh;str
chop(
;qDebug()长度8的字符串chop(
结果str3;// 输出abc// 场景4n≤0无操作QString str4hello;str
chop(-
;qDebug()chop(-
结果str4;// 输出helloreturna.exec();}补充QString 其他函数的边界行为QString 的修改类函数如chop、truncate、left、right大多做了边界安全处理不会崩溃但访问类函数需注意QString::operator[]调试模式下索引越界会触发断言失败ASSERT发布模式下行为未定义可能返回随机字符。
QString::at(int i)索引越界时会抛出std::out_of_range异常Qt
10调试模式也会触发断言。
因此使用operator[]或at()时需先判断索引是否在有效范围内而chop无需担心边界问题。