2011-03-25 187 views
1

我想写一个变量监视类,允许我通过它一个指针(理想情况下void *)寻址通常会完全超出范围或者班级无法进入。然后该类将在屏幕上周期性地显示该内存位置的内容 - 以用户定义的方式解释(例如。(int *))。我只会使用这个指针从内存中读取数据,它会作为一个肮脏的破解,在开发期间为我在运行时暂时感兴趣的变量开发一种监视窗口 - 而不需要引入大量代码这些变量在范围/类可访问。使用无效的指针/内存地址:C++(windows)

我正在使用VC++ 2010,它似乎拒绝让我甚至写出一个超出范围的内存位置地址的指针。

我想在windows下有很多事情要做,因为这种方法在内存位置改变时可能具有非常有限的适用性,但我使用本机C++,因此希望我的地址足够持久以便有用。此外,我可以看到,它不会像我访问一个内存位置,我的程序实际上没有实际使用的安全原因...

任何想法我可以做到这一点? (我意识到使用这样的指针会产生未定义的行为,所以只会从中读取并显示值)。

谢谢。

+2

以什么方式VC++拒绝让你做到这一点?也就是说,到目前为止您尝试了什么?你应该只能说“void * x =(void *)12345;” – 2011-03-25 13:52:38

+0

如果你的目标是观察你自己的变量,你为什么要访问你没有使用的内存?这没有任何意义。 – 2011-03-25 13:54:29

+0

丹尼尔,我正在使用它 - 但例如它可能是堆栈上的地址,或删除的堆地址。我使用它的方式 - 我不指望它会消失,但理论上它可以... – ChrisJH 2011-03-25 14:02:14

回答

1

试图取消引用指向外部任何空间的指针都是非常没有意义的。您可能访问的地址甚至可能不会映射到进程的内存空间,因此实际上甚至没有可以查看的内容。
当您的流程开始时,您实际上并没有4 GB可供您使用。内存空间大小为4 GB,但主要由未映射到您的进程的空洞组成。

最终这一切都归结到你想要使用的指针的位置。内存地址,你通常可以账户可能来自:

  • 堆分配 - 通过mallocnew,尚未free d或deleted
  • 堆栈空间,全局变量分配的范围内的任何东西 - 任何你在程序中的当前位置范围内定义为程序中的变量。访问其他作用域中定义的任何内容都是没有意义的(例如,从函数返回指向局部变量的指针)
  • 代码段 - 内存中包含未卸载的进程的DLL或EXE的内存段的地址。通常您只能以只读访问权限访问它们。您可以通过查找函数的返回地址来找到这样的地址。

在刚刚释放的内存块中访问指针正是这种无意义的情况。一旦您释放了内存,就有一定的可能性,它已经返回到操作系统,并且该地址不再映射到您的进程。

您可以进一步了解这个here

+0

感谢您 - 我希望它会比原来的稍微没有意义...我必须以艰难的方式去做... – ChrisJH 2011-03-25 15:03:28