'Bad Ptr'在视觉C++中是什么意思?

What are 'Bad Ptr' mean in Visual C++?

本文关键字:是什么 意思 Bad Ptr 视觉 C++      更新时间:2023-10-16

对于c++,当我们检查指针是否有效时,通常做以下操作:

if (p == NULL){
     // error handling
}

然而,在vc++中,即使p也不是NULL(即0),它是0x00000004,也意味着坏Ptr。然后引起异常,我们知道这个地址是受保护的,不能被覆盖。

我在这里搜索了类似的问题,但是我没有得到答案。

我的问题是:

  1. 当坏Ptr发生时,为什么不把这个指针设置为0?
  2. 既然坏Ptr的值不为零,如何检查指针是否有效或不在vc++ ?

在Windows中,虚拟内存地址空间中的前65536个字节(地址0x00000000到0x0000FFFF) 总是未映射,永远无法寻址RAM。确保错误的指针值总是通过AccessViolation导致程序崩溃的特性。最常见的原因是NULL指针,但空指针并不只产生对地址0的访问。在像c++这样的面向对象编程语言中,试图通过空指针访问对象的成员会生成对大于0的地址的访问。大于对象内部成员的偏移量。

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

winapi有测试指针值是否坏的函数。但是我不打算记录它们,因为这些函数是危险的。

像这样的指针值总是是代码中的错误。
  1. 坏Ptr并不意味着0总是,它意味着指针是无效的(地址是无效的,如包含垃圾,或地址是有效的,但不属于你的程序等)。0NULL为特例

  2. 在声明指针时,应该始终初始化指针,使用有效地址或nullptr。然后你可以在使用if(p==nullptr)之前检查它。

    例如

    int* p = reinterpret_cast<int*>(100);

这里的p不是NULL,但是它指向一个无效的地址