gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:21 25 4
gpt4 key购买 nike

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

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

我猜想在 Windows 的幕后发生了很多事情,因此随着内存位置的变化,这种方法的适用性可能非常有限,但我使用的是 native C++,所以我希望我的地址足够持久以供使用。此外,我可以看到它不希望我访问我的程序出于安全原因实际未使用的内存位置...

有什么办法可以做到这一点吗? (我意识到使用这样的指针会导致未定义的行为,因此只会从中读取并显示值)。

谢谢。

最佳答案

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

最终,这一切都归结为您获得要尝试使用的指针的位置。您通常可以说明的内存地址可能来自:

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

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

您可以进一步阅读 here

关于c++ - 使用无效指针/内存地址 : C++ (windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5433335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com