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

C++双向链表get_set函数接收参数与传入值不一致问题求助

问题根因汇总
  • 未定义行为导致的内存污染
    90%以上的这类异常都是双向链表实现中存在野指针、内存越界、节点循环引用导致的。size()成员函数在计算参数时如果访问了非法内存,会直接破坏函数调用栈上已经完成计算的参数值,同时损坏当前对象的成员数据,最终导致进入get_set后读取到的参数、this->size()返回值都和外部预期不符。C++的未定义行为没有固定报错表现,你遇到的参数错乱是非常典型的UB特征。
  • 函数参数求值顺序+非const方法的副作用
    C++标准不约束函数参数的求值顺序,你调用get_set时的两个入参dll_UT->size()/2+1和dll_UT->size()-1的执行顺序是不确定的。如果你的size()没有声明为const成员函数,内部存在修改链表节点计数、移动头尾指针等副作用,就会导致两次size()调用的返回值出现偏差,甚至修改已计算好的参数存储区域。
  • 形参声明错误或对象指针悬空
    如果get_set的position_from形参被误声明为非常量左值引用,绑定到临时计算结果后会出现引用悬空,读取到的就是脏数据。另外如果dll_UT本身是悬空指针(指向已释放的内存、已销毁的栈对象),外部调用size()时刚好读取到残留的200脏值,进入成员函数后this指向非法空间,所有成员读取结果都会错乱。
排查建议
  • 给size()成员函数加上const修饰,禁止内部修改任何类成员,同时在size()内部添加打印确认调用次数和返回值,排除求值顺序的影响。
  • 检查get_set的形参列表,确认所有位置类参数都是值传递,没有误写为引用类型。
  • 开启编译器的地址消毒器(gcc/clang加-fsanitize=address编译选项,VS开启地址 sanitizer)或者用valgrind运行测试代码,直接定位内存越界、野指针的具体位置。

内容的提问来源于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 08:15:03