C++包含嵌套结构体的指针数组按日期排序时出现内存访问异常问题排查
C++包含嵌套结构体的指针数组按日期排序时出现内存访问异常问题排查
看起来你遇到的是内存访问越界+指针指向错误的问题,咱们一步步拆解你的代码来找问题根源:
核心错误点分析
先看你批量添加订单的case 2代码,这里有个非常明显的索引错误:
for (int i = 0; i < many_orders; i++) { cout << "Information for next order: " << "\n"; order[counter + i] = add_order(); all_orders[counter + 1] = &order[counter + 1]; // 这里错了! }
不管循环多少次,你都在给all_orders[counter+1]赋值,而且取的是order[counter+1]的地址——这会导致两个严重问题:
- 指针数组的前
counter个位置(比如初始counter为0时的all_orders[0])根本没被赋值,是空指针,排序时访问空指针就会触发内存错误,这就是你看到“第二个元素读不对”的原因(其实是第一个未初始化的空指针)。 - 循环多次时,同一个指针位置会被重复覆盖,后续订单的指针根本没存在数组里。
除此之外,还有潜在的order数组生命周期问题:如果order是局部数组(比如在do_work_customer_mode里声明的),那当函数退出后,all_orders里的指针就会变成野指针,后续访问也会出问题。
修复方案
1. 先修正批量添加的索引错误
把循环里的counter + 1改成counter + i,同时加上数组容量检查避免越界:
case 2: cout << "How many orders would you like to add? "; cin >> many_orders; // 检查是否超过指针数组的最大容量 if (counter + many_orders >= 100) { cout << "Error: Too many orders, maximum 100 allowed." << endl; break; } for (int i = 0; i < many_orders; i++) { cout << "Information for next order: " << "\n"; int current_idx = counter + i; order[current_idx] = add_order(); all_orders[current_idx] = &order[current_idx]; } counter += many_orders; break;
同时给单个添加订单的case 1也加上边界检查:
case 1: if (counter >= 100) { cout << "Error: Maximum order limit reached." << endl; break; } order[counter] = add_order(); all_orders[counter] = &order[counter]; counter++; break;
2. 优化内存管理,避免野指针问题
建议用动态分配内存替代全局/局部的order数组,这样就不用依赖数组的生命周期了:
// 修改单个添加订单的逻辑 case 1: if (counter >= 100) { cout << "Error: Maximum order limit reached." << endl; break; } // 动态分配tech_info对象,直接把指针存在数组里 all_orders[counter] = new tech_info(add_order()); counter++; break; // 修改批量添加的逻辑 case 2: cout << "How many orders would you like to add? "; cin >> many_orders; if (counter + many_orders >= 100) { cout << "Error: Too many orders, maximum 100 allowed." << endl; break; } for (int i = 0; i < many_orders; i++) { cout << "Information for next order: " << "\n"; int current_idx = counter + i; all_orders[current_idx] = new tech_info(add_order()); } counter += many_orders; break;
这样all_orders里的指针都指向堆上的结构体,不会因为局部变量销毁变成野指针。
3. 确认排序逻辑的正确性
你的compare_date函数是符合严格弱序要求的,用来给std::sort做比较是没问题的,只要指针数组里的元素都是有效指针,排序就能正常按日期升序排列。
额外注意事项
- 确保
counter是全局变量或者通过引用传递给各个函数,避免出现多个函数用不同counter值的情况。 - 程序退出前记得释放动态分配的内存,避免内存泄漏:
// 比如在程序结束前遍历指针数组释放内存 for (int i = 0; i < counter; i++) { delete all_orders[i]; }
备注:内容来源于stack exchange,提问作者radoslav pavlov
相关产品推荐
相关产品推荐

