为什么“this”指针在单步执行代码时会改变其值?

2024-04-02

我正在调试崩溃,我注意到调试器的一个步骤,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当我们单步执行给定成员函数中的代码时,可以或应该改变吗?

Update

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

那么这意味着什么,是否只有发布版本才有问题?

@drescherjm 的评论被赞成,其中说in release mode the this pointer is not correct because of optimization但“不正确”到底是什么意思呢?我们不能相信this发布版本中的指针(是假的)或者指针值是正确的,但发布版本由于优化而被破坏?


根据调试器的不同,看到以下值可能是正常的this之间改变hitting函数和entering it.

hitting S::f()

entering S::f()

However, once you've entered the function, the value of this shouldn't change1. If it does, it probably means that you have some sort of buffer overrun and are overwriting your stack.

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

您似乎也在使用优化的构建来看待这个问题。使用优化时要非常小心地依赖调试器:变量可能会从代码中消失,给您留下它们的值错误的印象。如果您可以重现该问题,我会尝试记录this某处而不是通过调试器查看它。这整件事实际上可能是一个转移注意力的事情。

1However, this can change when you're calling another member function across a hierarchy, especially when virtual bases are involved.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“this”指针在单步执行代码时会改变其值? 的相关文章

随机推荐

  • Ruby on Rails 中的延迟作业如何工作?

    我对此很陌生 对延迟工作的工作原理不太困惑 我知道它会创建一个表并将作业放入表中 然后我需要运行 rake jobs work 启动后台进程 现在我的问题是 DJ 脚本是否每分钟检查一次表 当时间与 job at 时间匹配时 它会运行该作业
  • 删除与模型关联的文件 - django

    我的一个模型中有以下代码 class PostImage models Model post models ForeignKey Post related name images figure out a way to have image
  • Xamarin.Android 绑定无效操作码

    最近收到一个新的 Android SDK aar 来绑定在 Xamarin 中 最初开始绑定时 我收到错误 COMPILETODALVIK Uncaught translation error com android dx cf code
  • 如何解析xsd:dateTime格式?

    xsd dateTime 类型的值可以有多种形式 如描述于RELAX NG http books xmlschemata org relaxng ch19 77049 html 如何将所有表单解析为时间或日期时间对象 它实际上是一种非常受限
  • 如何通过我自己的模板使用内置密码重置/更改视图

    例如我可以指出url accounts password reset to django contrib auth views password reset在上下文中使用我的模板文件名 但我认为需要发送更多上下文详细信息 我需要确切地知道为
  • 使用python打印月份和日期

    我试图在 python 中仅打印月份和日期 如下所示 09 December 08 October 我怎么能这么做呢 Try this import datetime now datetime datetime now print now
  • 命令行参数 - 所需对象:'objshell.NameSpace(...)'

    我正在编写一个脚本 该脚本将利用 Windows 的内置功能来解压缩提供的 zip 文件 我对 vbscript 还很陌生 所以有些语法让我有点困惑 我正在使用一些现有代码并尝试修改它 以便它将采用命令行选项作为文件名 如果我使用命令行传递
  • 仅向一个应用程序发送广播意图,而不使用显式意图

    我有个问题 我正在做一个外部 android 服务 应用程序可以注册它来接收信息 信息通过广播从服务返回到应用程序 并通过broadcastReceiver 问题是如果我这样做sendBroadcast 任何应用程序都可以监听其他应用程序的
  • 结构末尾的大小为 0 的数组[重复]

    这个问题在这里已经有答案了 我正在学习的系统编程课程的教授今天告诉我们要定义一个末尾带有零长度数组的结构体 struct array size t size int data 0 typedef struct array array 这是一
  • 极长工作流程的 Cucumber 场景

    我们需要为一个功能测试一个漫长的步骤过程 从登录到许多模式对话框 多步骤表单以及不同角色的用户都在交互 我们如何将这个过程的各个部分分解为单独的场景 这是一个例子 Scenario New Manuscript Given I am on
  • 如何获取用户当前在 Spotify 应用程序中收听的内容的信息 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Android 应用程序 在后台运行并使用 Spotify SDK 能否获取用户当前在 Spotify Android 应用程序中收听
  • 是否有复杂的 Java WorkQueue API?

    我正在寻找具有以下功能的 WorkQueue API java util Queue兼容的 优惠 可选 集合语义 单处理和批处理 并发 当然 调度 different processing policies 等到下一次计划执行 如果批量大小
  • PowerPivot 中的滚动 12 个月总和

    在 PowerPivot Excel 2016 中 我编写了滚动 12 个月销售额总和的公式 如下所示 Rolling Sum CALCULATE Sales DATESBETWEEN Sales Date FIRSTDATE DATEAD
  • Python:使用 Openpyxl 读取大型 Excel 工作表

    我有一个 Excel 文件 其中包含大约 400 个工作表 其中 375 个工作表需要保存为 CSV 文件 我尝试过 VBA 解决方案 但 Excel 在打开此工作簿时遇到问题 我创建了一个 python 脚本来做到这一点 然而 它会迅速消
  • UISegmentedControl 截断段标题

    我的 iPhone 应用程序中有一个分段控件 在 ios6 上运行良好 但在 ios7 上 分段图块被截断 有足够的空间容纳文本 但无论如何都会截断它们 self segmentedControl segmentedControlStyle
  • tf.estimator.train_and_evaluate 出错了 评估精度和损失

    I use tf estimator train and evaluate训练和评估我的模型 这是我的代码 import tensorflow as tf import numpy as np from tensorflow contrib
  • 为什么 C++ 友元类只需要在其他命名空间中进行前向声明?

    假设我有一堂课F那应该是班级的朋友G 在全局命名空间中 和C 在命名空间中A 成为朋友A C F必须向前声明 成为朋友G 没有前向声明F是必要的 同样 一个类A BF可以成为朋友A C无前置声明 以下代码说明了这一点 并使用 GCC 4 5
  • 将 C++ 代码从 Windows 移植到 Mac

    我是一名长期的 Windows 开发人员 看起来我将参与将 Windows 应用程序移植到 Mac 的工作 我们决定对两侧的 GUI 使用 Flex Air 顺便说一句 它看起来非常光滑 我的 Windows 应用程序有一个控制网络适配器
  • R 错误:“尝试在 get1index 中选择少于一个元素”

    我是 R 初学者 我正在尝试使用该包ClonEvol 但是 github 网页上的文档非常有限 所以现在我正在使用他们的示例代码并尝试将其适应我的数据 称为ce ce lt data frame cluster c 1 1 1 1 2 2
  • 为什么“this”指针在单步执行代码时会改变其值?

    我正在调试崩溃 我注意到调试器的一个步骤 this指针改变了它的值 经过 3 个步骤 它最终得到了值 0x00000001 应用程序崩溃了 现在 0x00000001 值显然是错误的 但我真的应该期待吗this当我单步执行调试器时值会改变吗