STL中的容器map:不要用指针做键值

在运行程序时发现数据重复运行结果出现差异,经过排查,问题源于在STL map中使用指向message的指针作为键值。由于map会根据键值排序,指针的不可控性导致每次运行message的顺序不同,进而影响结果。修正方法是避免使用指针作为map的键值,确保结果的可控制性。

我不知道会不会有人跟我犯同样的错误。我只能说,这个bug实在太奇葩了。


这两天在跑trace时发现,同样的参数下重复运行,第一次的数据总是跟后面几次有很大出路。一开始觉得是随机数的关系,但心里总有些不安。试着重复运行了10次,果然第一次跟后面9次的数据有明显不同,delivery rate大概有5%的差距。

于是我怀疑会不会是结果之间有干涉,例如用来保存结果的数组之间由于编码的问题互相干扰。但反复的检查过后,确定不是这方面的问题。

接下来开始检查随机数的问题。在程序中有两个地方用到了随机数,一个是source node的选择,一个是interests的产生。(专门研究了一下随机数的机制,调用了srand()之后随机数的计算会重启)在这两个地方设置了srand(1),也就是控制trace的每次执行,随机数序列是一样的,但问题依旧。

这说明在某个地方仍然存在不可控制的因素。然后开始检查helpful类。这个类是node的一个子类,表示所有node的行为是合作的策略。试着注释掉connect函数中缓存电影的部分,出人意料的事情发生了,这次所有的数据是一致的。

但问题仍然没有解决,因为不明白为什么会出现这样的情况。试着按时间轴输出每个session中的message

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值