B树插入函数报错:vector subscript out of range 问题求助
B树插入函数vector下标越界问题排查
问题说明
实现C++ B树插入函数时,插入50个及以下元素运行正常,但插入100个元素会触发vector subscript out of range错误,已尝试打印调试信息但无法定位问题。
核心排查点
- 节点分裂逻辑漏洞
检查分裂节点时的vector操作:- 分裂后原节点与新节点的元素分配是否符合B树阶数规则,比如是否错误地访问了超过原节点vector大小的下标
- 父节点插入中间元素时,是否误用了超出自身vector当前size的下标
- 递归插入的边界处理
递归到叶子节点插入元素时,是否在元素数量达到上限时未及时触发分裂,导致后续访问vector下标越界 - vector下标访问的合法性
遍历代码中所有用[]访问vector的位置,确认下标是否严格小于vector.size():- 查找插入位置的循环是否存在越界,比如循环结束时下标等于size却仍用
[]访问 - 空vector或未初始化的vector是否被直接用
[]访问
- 查找插入位置的循环是否存在越界,比如循环结束时下标等于size却仍用
- 调试信息强化
补充打印每个节点的元素数量、当前访问的下标值,重点跟踪触发错误前最后几次插入的节点状态,尤其是分裂前后的vector变化
代码片段检查示例
比如节点分裂的关键代码,要确认vector访问的合法性:
void split(Node* parent, int index) { Node* child = parent->children[index]; Node* newChild = new Node(child->isLeaf); newChild->keys.resize(order/2 - 1); // 这里要确保child->keys的size >= i + order/2 for (int i = 0; i < order/2 - 1; i++) { newChild->keys[i] = child->keys[i + order/2]; } // 父节点插入中间元素的逻辑也要检查下标是否合法 parent->keys.insert(parent->keys.begin() + index, child->keys[order/2 - 1]); }
如果child->keys的实际大小不足order/2,就会触发下标越界。
内容的提问来源于stack exchange,提问作者Vinh Phạm
相关产品推荐
相关产品推荐

