class CCtrl
{
...Other Members...
RankCache m_stRankCache;
uint32 m_uSyncListTime;
};
int CCtrl::UpdateList()
{
uint32 tNow = GetNowTime();
for (uint8 i = 0; i < uRankListNum; i++)
{
m_stRankCache.Append(i);
}
m_uSyncListTime = tNow;
return 0;
}
以下是两件事:
当进入Append()时,p this = 0x7f3f467edfdc,但在UpdateGuildList(),p&amp; m_stRankCache = 0x7f3f067edfdc中,这两个指针是不同的。
tNow = 1418916316,执行m_uSyncListTime = tNow后,m_uSyncListTime仍为0.
怎么会发生这种情况?我用了一整天的时间进行调试。我检查了我的代码,没有pack(1)和pack()不匹配。
答案 0 :(得分:1)
问题很可能是您使用调试器来调试已优化的代码。正如您的评论建议的那样,您正在调试使用-O3
标志编译的代码,表示优化。
即使你正在使用gdb
,Visual Studio和其他调试器也会遇到同样的问题,而这个问题是调试优化代码并使调试器工作&#34;从某种意义上说,调试器跟随源代码中的行以及已声明的变量。
调试器假定源代码的行与生成的汇编代码匹配。启用优化后,情况就不再如此。代码和变量被删除,移动等等。因此,您认为代码中的行(包括变量声明)应该位于特定位置,可能不会出现在最终的优化构建中。
调试器无法识别这些更改,因此您会得到用于变量的错误值,或者在某些情况下,您得到的变量不存在&#34;调试器报告的错误。
此外,如果调试环境出现问题,它也可以作为一个很好的检查,以便对问题中的值进行简单的cout
或记录。在某些情况下,即使是调试器也可能出错,因此应使用备份验证系统(即logging,printf()或cout
语句等)。