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

C++ 使用无效指针/内存地址:C++;(窗口),c++,pointers,memory-address,C++,Pointers,Memory Address,我正在尝试编写一个变量监视类,它允许我向它传递一个指针(理想情况下为void*),该指针寻址一个通常完全超出范围或该类无法访问的内存位置。然后,该类将定期在屏幕上以文本形式显示该内存位置的内容——以用户定义的方式进行解释(例如(int*))。我只会使用这个指针从内存中读取数据,这将成为一种卑鄙的手段,在开发过程中为我在运行时暂时感兴趣监视的变量启用一种监视窗口,而不会引入大量代码来将这些变量引入类的作用域/可访问性 我正在使用VC++2010,它似乎断然拒绝让我甚至写一个超出范围的内存位置地址到

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

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

P>我想Windows下的引擎盖下会有很多事情,这样的方法可能会因为内存位置的改变而有非常有限的适用性,但是我使用的是本地C++,所以我希望我的地址能够持久地使用。此外,我可以看到,它不希望我访问一个内存位置,我的程序实际上没有使用的安全原因

你知道我该怎么做吗?(我意识到使用这些指针会导致未定义的行为,因此只能从中读取并显示值)


谢谢。

试图取消引用指向您可以解释的任何空间之外的指针是毫无意义的。您可能正在访问的地址甚至可能没有映射到进程的内存空间中,因此实际上根本没有什么可看的。
当您的进程启动时,您实际上没有4 GB可供使用。内存空间大小为4 GB,但大部分由未映射到进程的孔组成

最终,这一切都归结于你在哪里得到了你试图使用的指针。您通常可以解释的内存地址可能来自:

  • 堆分配-在
    malloc
    new
    分配的范围内,但尚未
    free
    d或
    deleted
  • 堆栈空间,全局变量-在程序中当前位置范围内,在程序中定义为变量的任何内容。访问其他作用域中定义的任何内容都是毫无意义的(例如,从函数返回指向局部变量的指针)
  • 代码段-内存段中包含未卸载的进程DLL或EXE的地址。通常,您只能以只读方式访问它们。例如,您可以通过查找函数的返回地址来查找这些地址
访问刚刚释放的内存块中的指针正是这种无意义的情况。一旦释放内存,就有可能内存已经返回到操作系统,并且该地址不再映射到进程


您可以进一步了解这一点

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

最终,这一切都归结于你在哪里得到了你试图使用的指针。您通常可以解释的内存地址可能来自:

  • 堆分配-在
    malloc
    new
    分配的范围内,但尚未
    free
    d或
    deleted
  • 堆栈空间,全局变量-在程序中当前位置范围内,在程序中定义为变量的任何内容。访问其他作用域中定义的任何内容都是毫无意义的(例如,从函数返回指向局部变量的指针)
  • 代码段-内存段中包含未卸载的进程DLL或EXE的地址。通常,您只能以只读方式访问它们。例如,您可以通过查找函数的返回地址来查找这些地址
访问刚刚释放的内存块中的指针正是这种无意义的情况。一旦释放内存,就有可能内存已经返回到操作系统,并且该地址不再映射到进程


您可以进一步了解这一点

,VC++以何种方式拒绝您这样做?也就是说,到目前为止你试过什么?您应该能够只说“void*x=(void*)12345;”如果您的目标是监视您自己的变量,那么为什么要尝试访问您不使用的内存?这没有任何意义。丹尼尔,我正在使用它-但例如,它可能是堆栈上的地址,或者是已删除的堆地址。我使用它的方式-我不希望它消失,但理论上它可能会消失…欧内斯特-我将制作一个简化的例子…欧内斯特-有趣的是,在一个新项目中的一个简化的例子上,它工作得很好-但不是在一个更大的复杂应用程序的混合中-更复杂的内存分配在表面下进行。我想是以什么方式VC++拒绝让你这么做?也就是说,到目前为止你试过什么?您应该能够只说“void*x=(void*)12345;”如果您的目标是监视您自己的变量,那么为什么要尝试访问您不使用的内存?这没有任何意义。丹尼尔,我正在使用它-但例如,它可能是堆栈上的地址,或者是已删除的堆地址。我使用它的方式-我不希望它消失,但在理论上它可以…欧内斯特-我将制作一个简化的例子…欧内斯特-有趣的是,在一个新项目的简化例子中,它工作得很好-但是