双向链表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。
排查步骤
- 先将
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);
- 全量重新编译整个项目,排除增量编译导致的二进制不兼容问题。
- 给
size()函数加const限定符,避免函数内部修改成员变量,同时确认size()的实现逻辑没有问题。
内容的提问来源于stack exchange,提问作者StickOnAStick
相关产品推荐
相关产品推荐

