使用无效指针/内存地址:C ++(windows)

时间:2011-03-25 13:49:55

标签: c++ pointers memory-address

我正在尝试编写一个变量监视类,它允许我传递一个指针(理想情况下为void *)来寻址内存位置,该内存位置通常完全超出范围或无法访问该类。然后,该类将在屏幕上以文本周期性地显示该存储器位置的内容 - 以用户定义的方式解释(例如,(int *))。我只会使用这个指针从内存中读取它,它将作为一个肮脏的黑客,在开发期间启用一种观察窗口,我暂时感兴趣的变量在运行时监控 - 没有引入大量的代码带来这些变量在范围内/可供类访问。

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

我想在windows下有很多内容,因为这种方法的适用性可能非常有限,因为内存位置会发生变化,但我使用的是原生C ++,所以我希望我的地址足够持久,非常有用。此外,我可以看到它不希望我出于安全原因访问我的程序实际上没有使用的内存位置...

我有什么想法可以做到这一点? (我意识到使用这样的指针会产生未定义的行为,因此只能读取它们并显示值)。

感谢。

1 个答案:

答案 0 :(得分:1)

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

最终,这一切都归结为你正在尝试使用的指针。您通常可以占用的内存地址可能来自:

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

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

您可以进一步了解此here