gpt4 book ai didi

c++ - 为什么 'this' 指针在单步执行代码时会更改其值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:27 25 4
gpt4 key购买 nike

我正在调试崩溃,我注意到通过调试器的一个步骤,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;
}

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

更新

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

那是什么意思,是不是只有release build有问题?

@drescherjm 的评论被投票,其中说在 Release模式下,由于优化,this 指针不正确但是“不正确”到底是什么意思?我们不能相信发布版本中的 this 指针(是伪造的)或者指针值是正确的但发布版本由于优化而被破坏?

最佳答案

根据调试器的不同,this 的值在点击函数和进入函数之间发生变化可能是正常的。 p>

this==0xcccccccc before entering the function

点击 S::f()

this has a valid address after entering the function

正在输入 S::f()

但是,一旦您进入该函数,this 的值就不应更改1。如果是这样,则可能意味着您有某种缓冲区溢出并且正在覆盖您的堆栈。

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

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

1但是,可以在您跨层次结构调用另一个成员函数时发生变化,尤其是当虚拟基是涉及。

关于c++ - 为什么 'this' 指针在单步执行代码时会更改其值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39105633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com