You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双向链表get_set函数调用时size()返回值翻倍异常排查求助

问题根因分析及解决方案

核心原因排查方向

  • 宏参数多次求值副作用:ASSERT_EQ是Google Test的宏定义,传入的表达式会被展开后多次求值。如果你的size()成员函数实现存在副作用(比如每次调用会修改内部计数、或者依赖会随调用变化的临时变量),会导致计算两个入参时size()的返回值不一致。
  • 声明与定义不匹配:检查头文件中get_set的函数声明,是否和cpp文件中的定义存在参数顺序、参数类型、返回值类型不匹配的问题:
    • 你贴出的代码中get_set声明返回值为Doubly_linked_list,但实际返回std::vector<int>,类型不匹配会触发未定义行为,参数传递过程可能出现异常
    • 检查参数类型是否写错,你代码中第二个参数的unsigned_position如果是自定义类型,和unsigned的位宽不一致会导致值解析错误
  • 增量编译导致的二进制不兼容:如果你修改过双向链表类的成员定义(比如新增/删除了成员变量、修改了size变量的存储位置),只重新编译了test.cpp没有重新编译doubly_linked_list.cpp,会导致两个编译单元对类内存布局的认知不一致,读取size成员时偏移错误,读出翻倍的异常值。
  • 运算符优先级问题:确认你的size()返回值类型,如果是无符号类型且重载了/或者+运算符,运算优先级不符合预期也可能导致计算结果异常,可通过加括号明确运算顺序:(dll_UT->size()/2)+1。

排查步骤

  1. 先将get_set的入参计算提前到局部变量,再传入函数,验证是否还有异常:
unsigned from = (dll_UT->size() / 2) + 1;
unsigned to = dll_UT->size() - 1;
std::cout << "from = " << from << ", to = " << to << std::endl;
dll_UT->get_set(from, to);
  1. 全量重新编译整个项目,排除增量编译导致的二进制不兼容问题。
  2. 给size()函数加const限定符,避免函数内部修改成员变量,同时确认size()的实现逻辑没有问题。

内容的提问来源于stack exchange,提问作者StickOnAStick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:54:04