什么是'坏Ptr'在Visual C++中的意思?

zan*_*ngw 0 c++ pointers window visual-c++

对于C++,当我们检查指针是否有效时,通常我们会执行以下操作:

if (p == NULL){
     // error handling
}
Run Code Online (Sandbox Code Playgroud)

但是,在VC++中,即使p不是NULL(又名0),它也是0x00000004,也就是Bad Ptr.然后导致异常,我们知道这个地址是受保护的,不能被覆盖.

我在这里搜索过类似的问题,但我没有得到答案.

我的问题是:

  1. 当Bad Ptr发生时,为什么不将此指针设置为0?
  2. 由于Bad Ptr的值不为零,如何在VC++中检查指针是否有效?

Han*_*ant 8

在Windows中,虚拟内存地址空间中的前65536个字节(地址0x00000000到0x0000FFFF)始终未映射,从而无法寻址RAM.一种功能,可确保错误的指针值始终使用AccessViolation使程序崩溃.最常见的原因是NULL指针,但是空指针并不专门产生对地址0的访问.例如,在面向对象的编程语言(如C++)中,尝试通过空指针访问对象的成员会生成对更大地址的访问比对象内的成员偏移量大.

这不是调试器停止的地方,您还会在其他地址上看到Bad Ptr,这是引用未映射的内存页面的类型.并且,如果取消引用,也会使您的程序崩溃.开始使用调试器的一个很好的理由.但不是你的情况,0x00000004已被底部的禁区覆盖.

winapi具有测试指针值是否为坏的功能.我不打算记录它们,这些功能很危险.

像这样的指针值始终是代码中的错误.你必须修复这个bug.