C ++变量地址不匹配

时间:2014-12-18 15:46:57

标签: c++

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;
}

以下是两件事:

  1. 当进入Append()时,p this = 0x7f3f467edfdc,但在UpdateGuildList(),p&amp; m_stRankCache = 0x7f3f067edfdc中,这两个指针是不同的。

  2. tNow = 1418916316,执行m_uSyncListTime = tNow后,m_uSyncListTime仍为0.

  3. 怎么会发生这种情况?我用了一整天的时间进行调试。我检查了我的代码,没有pack(1)和pack()不匹配。

1 个答案:

答案 0 :(得分:1)

问题很可能是您使用调试器来调试已优化的代码。正如您的评论建议的那样,您正在调试使用-O3标志编译的代码,表示优化。

即使你正在使用gdb,Visual Studio和其他调试器也会遇到同样的问题,而这个问题是调试优化代码并使调试器工作&#34;从某种意义上说,调试器跟随源代码中的行以及已声明的变量。

调试器假定源代码的行与生成的汇编代码匹配。启用优化后,情况就不再如此。代码和变量被删除,移动等等。因此,您认为代码中的行(包括变量声明)应该位于特定位置,可能不会出现在最终的优化构建中。

调试器无法识别这些更改,因此您会得到用于变量的错误值,或者在某些情况下,您得到的变量不存在&#34;调试器报告的错误。

此外,如果调试环境出现问题,它也可以作为一个很好的检查,以便对问题中的值进行简单的cout或记录。在某些情况下,即使是调试器也可能出错,因此应使用备份验证系统(即logging,printf()或cout语句等)。