WinDbg delete问题

2023-10-31

文章目录

1、测试程序如下:

#include "stdafx.h"
#include "CBaseDrvTest.h"

int _tmain(int argc, _TCHAR* argv[])
{

	CBaseDrvTest* pBase = new CBaseDrvTest;
	pBase->Init();
	std::cout << pBase->nValue << std::endl;

	delete pBase;
	pBase->UnInit();
	pBase->nLignt = 111;
	std::cout << pBase->nValue << std::endl;

	system("pause");
	return 0;
}

2、测试时发现测试所用的VS2008有时候也不会触发崩溃,抓取的dump信息如下:

0:000:x86> ~0s; .ecxr ; kb
ntdll_76e90000!NtWaitForMultipleObjects+0xc:
76f032fc c21400          ret     14h
Minidump doesn't have an exception context
Unable to get exception context, HRESULT 0x80004002
ChildEBP RetAddr  Args to Child              
005df0ec 76647ef3 00000003 005df320 00000001 ntdll_76e90000!NtWaitForMultipleObjects+0xc
WARNING: Stack unwind information not available. Following frames may be wrong.
005df280 76647da8 00000003 005df320 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x133
005df29c 75ec6967 00000003 005df320 00000000 KERNELBASE!WaitForMultipleObjects+0x18
005df348 75ec6598 00000000 00000000 005df43c kernel32!WerpReportFaultInternal+0x3b7
005df364 75e9c299 005df40c 766fce6b 005df43c kernel32!WerpReportFault+0x9d
005df36c 766fce6b 005df43c 00000001 5c7948c7 kernel32!BasepReportFault+0x19
005df40c 76f3287e 005df43c 76f072f2 005dfddc KERNELBASE!UnhandledExceptionFilter+0x29b
005dfddc 76ef8774 ffffffff 76f1a120 00000000 ntdll_76e90000!__RtlUserThreadStart+0x3a109
005dfdec 00000000 00f37b48 00763000 00000000 ntdll_76e90000!_RtlUserThreadStart+0x1b

从上面看,没有相关的堆栈信息,接下来按照之前说过的方法操作,得到

dump信息
3、从dump信息看,应该是进程在退出的时候free内存出现了问题,导致了崩溃
提示**“scalar deleting destructor”**,怀疑是指针被delete、或者delete之后还使用了指针,即使用了野指针、或者被释放的内存越界等就会出现这个提示

4、除此之没有其他的信息,但是测试用例相对简单,所以我们可以直接查看源代码

5、从代码看,在delete之后,还使用指针访问了成员函数和成员变量。从调试来看,在delete之后,可以调用成员函数,只有当访问成员变量时,程序会中断(对于VS2008来说,也可能不会,偶现)

	delete pBase;
	pBase->UnInit();
	pBase->nLignt = 111;
	std::cout << pBase->nValue << std::endl;

因此delete一个指针时,指针指向的内存区域并不会被清空,因为这样会占用CPU周期,此时它是一个危险的指针,会造成一些未定义的现象(或者是个野指针,若打印成员变量的值可能是个随机值)。根据测试情况,有可能发生崩溃有可能不会,因此就会出现,这些代码可能长时间运行不崩溃的情况,接着可能在某个时间点或者修改了某些逻辑后发生了崩溃,这种问题在大型的项目中是比较难发现的,有时候也不好复现。因此在代码编写的时候我们就要养成良好的习惯,在delete指针之后,最好是将其置为NULL,保证我们所使用的是一个有效的指针,而不是会造成不可预见错误的野指针。
使用new或malloc分配内存时,C ++会在内存中找到一些未使用的空间,将其标记为“已分配”(以确保该空间不会在释放前再次被使用),并为我们提供其地址。当使用delete操作指针, C ++会将其指向的内存区域标记为“未分配”,并可能将其交给任何要求它的人。这时候这块空间就可以被其他人进行操作:写入或者读取。因此再次操作类对象或类成员就会出错,因为内存中的内容以及大小都可能发生了变化。

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

WinDbg delete问题 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • A* 之间的差异 pA = 新 A;和 A* pA = 新 A();

    在 C 中 以下两个动态对象创建之间的确切区别是什么 A pA new A A pA new A 我做了一些测试 但似乎在这两种情况下 都调用了默认构造函数 并且仅调用了它 我正在寻找性能方面的任何差异 Thanks If A是 POD 类
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • 让 Jenkins 对远程用户不可见

    我的本地 Windows 设备上有一个 Jenkins 服务器 但我想让它对外界不可见 有关服务器的办公室规则 明显且不隐晦的 效果令人满意的方法是设置防火墙规则来阻止对其端口的传入访问 但我认为必须有一个 Jenkins 设置来阻止它向除
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • 爆发在即的赛道:十大生态30家常用跨链桥盘点

    写给用户的跨链桥工具集指南 作者 Azuma 编辑 郝方舟 出品 Odaily星球日报 ID o daily 随着 Solana Avalanche Fantom 等公链的集体爆发 新兴生态的造富效应正在抬头 为了追逐这些全新的财富机会 用
  • Materials Studio安装教程

    Materials Studio安装教程简易分享 看过了太多安装教程 需要破解license 总结了一下 出一版简单直装的教程供大家讨论 安装包 安装包放在pan了 链接 https pan baidu com s 1iEVBzuDzE T
  • nuclei poc模板编写笔记(二)

    匹配器 匹配器允许对协议响应进行不同类型的灵活比较 非常易于编写 并且可以根据需要添加多个检查以实现非常有效的扫描 类型 可以在请求中指定多个匹配器 基本上有6种类型的匹配器 Matcher Type Part Matched status
  • openGL之API学习(十)glReadBuffer

    该函数主要是确定颜色缓冲区的来源 不会影响到深度 模板等缓冲区的读取 这里的设置将会影响到glReadPixels glCopyTexImage1D glCopyTexImage2D glCopyTexSubImage1D glCopyTe
  • 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的办法

    建立好一个Maven项目后 如果Java Resources资源文件下没有src main java文件夹 并且在手动创建这个文件时提示 已存在文件 这说明 在这个项目配置中已经有了src main java这个文件夹 至于为什么不显示 我
  • 人脸属性识别 - 使用多任务学习模型在CelebA数据集上进行人脸属性识别任务

    在本博客中 我们将介绍如何使用多任务学习 Multi Task Learning MTL 模型在CelebA数据集上进行人脸属性识别 我们将详细介绍数据准备 模型构建 训练和评估的过程 最后 我们将展示如何使用训练好的模型对新的图像进行属性
  • dn-detr:通过去噪任务加速detr训练

    dn detr 通过去噪任务加速detr训练 论文链接 https arxiv org abs 2203 01305 自DETR问世以来 transformer被引入到了目标检测领域 DETR通过引入query和bipartite grap
  • 基础算法5——双指针

    双指针算法 双指针是一种编程思想 不是某种具体的编程套路或是算法 很多需要双重暴力循环解决的问题 用双指针的思想都可以大大减少复杂度 for i 0 j 0 i lt n i while j lt i check i j j 每道题目的具体
  • 【疑难杂症】解决苹果MacOS升级提示“验证固件时发生错误”,无论如何都无法升级更新,主板Boot Rom、SMC版本号更新!

    如果你试了网上流传的通用解决办法 dmg没出错 修改dns 修改系统时间 断网安装 制作U盘镜像等 还没有升级成功 很可能你和我遇到的是同样问题 我的机器是Macbook Pro 2015 具体型号是mf840 工作原因平时不怎么敢升级系统
  • 2018 公开课盘点学术篇:链接优秀年轻 AI 学者,「大讲堂」让新生 AI 学术力量被看见...

    雷锋网 公众号 雷锋网 AI 科技评论按 2018 年 AI 研习社为大家呈上了一系列公开课 让更多的 AI 学术人员得以分享 传播自己的研究成果 也让科技爱好者们 学生们 其它研究人员们增进了对人工智能相关思维 知识 应用的认识 为国内人
  • 【大数据】Flink 从入门到实践(一):初步介绍

    Flink 从入门到实践 一 初步介绍 Apache Flink 是一个框架和分布式处理引擎 用于在 无边界 和 有边界 数据流上进行 有状态 的计算 Flink 能在所有常见集群环境中运行 并能以内存速度和任意规模进行计算 1 架构 1
  • Git上传文件代码到GitHub(超详细)

    Git上传文件代码到GitHub 超详细 之前用git上传代码到GitHub上 时间一长又忘了 总结一下写下来 后面上传忘了再看 1 新建一个空文件夹 用来上传文件 空文件夹放在那里都可以 2 点进去空文件夹 鼠标右键 使用Git Bash
  • 淘汰赛冠军问题

    问题描述 有n个选手 n为2的K次方 进行比赛 两个选手中胜者参加下一场 负者出局 请求出最后的冠军 比赛的胜负由cmp 函数决定 这里是比较两个字符的大小 分析 本体很快可以想到两种方法 分治法和减治法 分治法 将选手平均分为两组 递归求
  • Github上 10 个开源免费且优秀的后台控制面板

    来自 简书 作者 SevDot 链接 https www jianshu com p 3bc7404af887 Web 开发中几乎的平台都需要一个后台管理 但是从零开发一套后台控制面板并不容易 幸运的是有很多开源免费的后台控制面板可以给开发
  • uniapp AES加密解密

    uniapp里我知道的有两种aes加密解密方式 一 引入crypto js 1 需要在uniapp项目根目录里 打开命令行 执行如下命令 npm install crypto js 2 在项目根目录 创建一个utils文件夹 并创建一个ae
  • windows下ejbCA的安装和配置

    本文是windows平台的ejbCA配置记录 配置过程中参考了很多网上的资料 在此表示感谢 参见 http job2job blog 163 com blog static 1416633120071162154863 http www c
  • 解决Windows因丢失vcruntime140.dll文件无法运行程序问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个vcruntime140 dll文件进行安装 前
  • C#实现图片压缩算法,精简高效(含源码)

    C 实现图片压缩算法 精简高效 含源码 图片压缩可以有效地减小图片文件的大小 加快页面加载速度 并降低带宽占用 本文将介绍一种基于C 语言实现的图片压缩算法 其具有精简高效的特点 可以帮助你快速实现压缩图片的功能 压缩算法主要分为有损压缩和
  • 4.8 服务器上的 Git - GitLab

    4 8 服务器上的 Git GitLab 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 26 初稿 目录 文章目录 4 8 服务器上的 Git GitLab 版本说明 目录 GitLab 1 安装 Figure 50 B
  • WinDbg delete问题

    文章目录 1 测试程序如下 include stdafx h include CBaseDrvTest h int tmain int argc TCHAR argv CBaseDrvTest pBase new CBaseDrvTest