为什么'this'指针在单步执行代码时会改变它的值?

zar*_*zar 5 c++ debugging windbg

我正在调试崩溃,我注意到作为调试器的一步,this指针改变其值,经过3个步骤后,它最终得到值0x00000001并且应用程序崩溃.

现在0x00000001值显然是错误的,但是this当我逐步调试调试器时,我真的期望值会改变吗?

下面是我正在调试崩溃的构造函数.我已经this在每个步骤的注释中包含了指针的值,你可以看到它跳了很多.

CADOCommand::CADOCommand(CADODatabase* pAdoDatabase, CString strCommandText, int nCommandType)
{
    m_pCommand = NULL;
    m_pCommand.CreateInstance(__uuidof(Command)); // this = 0x515f9d10
    m_strCommandText = strCommandText; // this = 0x2c0c0ee8
    m_pCommand->CommandText = m_strCommandText.AllocSysString(); // this = 0x515f9d20
    m_nCommandType = nCommandType; // this = 0x70847a55
    m_pCommand->CommandType = (CommandTypeEnum)m_nCommandType; // this = 0x00000001
    m_pCommand->ActiveConnection = pAdoDatabase->GetActiveConnection(); 
    m_nRecordsAffected = 0;
}
Run Code Online (Sandbox Code Playgroud)

this我们单步执行给定成员函数中的代码时,是否存在可能或应该更改的值?

更新

我必须添加记录并回应几条评论,我正在调试发布版本,但是当我在调试版本中调试相同的函数时,其值this并没有改变.

那么这意味着什么,仅在发布版本中存在问题吗?

@drescherjm的评论是赞成的,in release mode the this pointer is not correct because of optimization但这说明"不正确"究竟是什么意思呢?我们不能相信发布版本中的这个指针(是假的)或指针值是否正确但是由于优化而导致发布版本被破坏?

isa*_*nae 6

根据调试器,也可能是正常的,看到的值this之间的变化功能,进入它.

这个== 0xcccccccc在进入函数之前

S::f()

进入该功能后,这个地址有效

进入 S::f()

但是,一旦进入该功能,其值this不应更改1.如果是这样,可能意味着你有某种缓冲区溢出并覆盖你的堆栈.

找出问题可能很棘手.您可以尝试打开内存断点,this以查看它何时更改或注释掉代码,直到问题消失.这应该可以帮助你缩小范围.请注意,罪魁祸首可能甚至不在那个特定的功能中:内存损坏因在不相关的地方造成破坏而臭名昭着.

您似乎也在使用优化的构建来查看此内容.在使用优化时要非常谨慎地依赖调试器:变量可能会从代码中消失,从而让人觉得它们的值是错误的.如果你可以重现这个问题,我会尝试在this某个地方登录而不是通过调试器查看它.整件事实际上可能是红鲱鱼.

1但是,当您在层次结构中调用另一个成员函数时,this 可能会发生更改,尤其是涉及虚拟基础时.