索引缓冲区越界问题:如何循环获取面索引数组中的每个索引?
解决面索引数组循环越界的问题
这个问题我之前处理过,核心是循环的终止条件和步长设置都有问题,导致了越界访问。咱们一步步来理清楚:
先说说原代码的问题
你现在的循环是for (int n = 0 ; n < updatedIndices.size(); n++),这里有两个明显的问题:
- 终止条件不对:当
n走到updatedIndices.size()-1时,n+1就等于数组的长度了,但数组的索引范围是0到size()-1,这时候访问updatedIndices[n+1]直接越界,触发崩溃。 - 步长不对:你每次要取3个连续索引组成三角形,但
n++会导致下一次循环重复处理前一组的后两个元素(比如n=0处理0/1/2,n=1又处理1/2/3),这显然不是你要的分组逻辑。
正确的解决方法
方法1:修正循环的终止条件和步长
直接调整循环,让n每次跳3步,同时确保n+2不会超出数组范围:
// 先判断数组长度是否是3的倍数,避免残留无法组成三角形的索引 if (updatedIndices.size() % 3 != 0) { std::cerr << "Warning: 索引数组长度不是3的倍数,无法全部组成三角形!" << std::endl; // 这里可以根据需求加错误处理,比如return或者抛出异常 } // 循环每3个索引一组处理 for (int n = 0; n < updatedIndices.size() - 2; n += 3) { int n0 = updatedIndices[n]; int n1 = updatedIndices[n+1]; int n2 = updatedIndices[n+2]; manual->triangle(n0, n1, n2); }
这里n += 3保证每次处理一组全新的3个索引,而n < updatedIndices.size() - 2确保n+2最大是updatedIndices.size()-1(当n=size()-3时),刚好是数组最后一个元素的索引,不会越界。
方法2:用迭代器遍历(适合std::vector)
如果你的updatedIndices是std::vector类型,用迭代器的写法会更直观,也能避免索引计算的错误:
for (auto it = updatedIndices.begin(); it != updatedIndices.end(); ) { // 检查剩余元素是否足够组成一个三角形 if (std::distance(it, updatedIndices.end()) < 3) { break; } int n0 = *it; int n1 = *(++it); int n2 = *(++it); manual->triangle(n0, n1, n2); ++it; // 移动到下一组的起始位置 }
这种写法不需要手动计算索引,通过迭代器的移动来分组,同样能保证不会越界。
额外提醒
一定要确保你的面索引数组的长度是3的倍数,不然最后会剩下1-2个无法组成三角形的索引,提前做判断能避免后续的逻辑错误哦。
内容的提问来源于stack exchange,提问作者andre
相关产品推荐
相关产品推荐

