pj4*_*533 8 c++ windows pointers memory-management
我有一个指向给定类的指针.可以说,例如,指针是:
0x24083094
Run Code Online (Sandbox Code Playgroud)
该指针指向:
0x03ac9184
Run Code Online (Sandbox Code Playgroud)
这是我班级的虚拟功能表.这对我来说很有意义.在windbg中,一切看起来都是正确的.
我删除了指针.现在0x24083094是:
0x604751f8
Run Code Online (Sandbox Code Playgroud)
但它不是一些随机垃圾,每次都会放在那里,它始终如一0x604751f8!这么多,以至于我可以实际使用该地址来确定是否删除了我的应用程序执行之间的指针!
但为什么?它如何确定0x604751f8应该写在那里?
为了记录,我正在使用Windows,在visual studio 2003下构建.
我知道我不能依赖于设定的值,即使它确实看起来是一致的,但我能依靠它不同吗?即,如果指针被删除,0x03ac9184将不会0x24083094,对吗?什么放在那里?它可能是任何东西,但0x03ac9184肯定不会存在(或者我仍然可以调用方法,因为那是虚函数表).我对吗?
我觉得我有答案.删除后不能依赖任何东西.也许一些背景会帮助人们看到我来自哪里.从本质上讲,我正在尝试修复一个错误,指针从我身下被删除.这是一个很长的故事,我不会详细介绍.
基本上,我试图检测到我处于这种情况,所以我可以优雅地退出我的功能.我想最简单和最好的方法是弄清楚谁实际拥有这个指针,然后问他是否有任何改变.所以我要实现这样的修复.它避免了我正在讨论的任何这个C++删除黑客.
然而,有趣的是,在我们的代码中,我们有一个名为"BogusObject"的类,它基本上充当一个托盘,捕捉那些意外取消引用释放对象的人.基本上,我们挂钩我们自己的删除函数,并将BogusObject类bash到任何释放类的vtable中.
然后,如果有人打电话给他们,他们会收到一条好消息说"嘿,有些事情是错的.".这种情况发生在我的情况下.即,0x604751f8+(someoffset)在BogusObject类中. 但是我们不再使用BogusObject了! 它确实没有在任何地方设置(如果我完全删除了BogusObject类,甚至连接正确),但我仍然得到一个好消息说错了!但我现在认为这是巧合.
由于某种原因,运行时0x604751f8在删除它时将该值放在this指针中,而这恰好与一个有类似这样的情况的类相对应!
Ecl*_*pse 16
标准中没有任何内容可以确定在那里写的内容.Visual Studio(至少在调试模式下)通常会在整个地方写入sentinal值,以帮助尽早捕获bug.
这个值不是你可以依赖的东西,但是如果你发现这个值神秘地出现在你的程序中,你可以假设你正在引用已删除的内存.有关一个编译器下的值列表,请参阅此答案.
完全有可能它是一个空闲列表指针,指向下一段空闲内存.大多数内存分配器使用他们跟踪的可用内存来存储跟踪数据,从而将其可用内存保存在各种链接列表中.
在任何情况下,除非你调用microsoft并获得一些文档说明为什 即便如此,要知道您的代码现在与一个编译器的行为联系在一起.在C++中,访问未分配的内存是不明确和邪恶的.
编辑:删除后,您甚至无法依赖该值更改.没有任何说明编译器需要修改删除数据.