【问题标题】:What are 'Bad Ptr' mean in Visual C++?Visual C++ 中的“Bad Ptr”是什么意思?
【发布时间】:2024-01-30 02:55:01
【问题描述】:

对于C++来说,当我们检查指针是否有效时,通常我们会这样做:

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

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

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

我的问题是:

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

【问题讨论】:

  • Bad Ptr 表示指针变量的值从未被初始化。调试助手用一个特定的值初始化它,以便它可以检测到这一点。指针在定义变量时应该初始化的一般规则也不例外。

标签: c++ pointers visual-c++ window


【解决方案1】:

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

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

winapi 具有测试指针值是否错误的功能。不过我不会记录它们,这些函数are dangerous

有这样的指针值总是代码中的一个错误。你必须修复这个错误。

【讨论】:

    【解决方案2】:
    1. Bad Ptr 并不总是意味着0,它意味着指针无效(地址无效如包含垃圾,或者地址有效但不属于您的程序等) . 0NULL 是一个特例。

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

      例如

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

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

    【讨论】:

    • 它相当于旧 c++ 中的NULL(11 之前)。但它更安全。
    • 感谢您的回答。这是我的案例,来自第 3 部分的一个 API。并且返回值是一个类似typedef struct redisReply { int type; int len; char *str; }的结构,这个返回结构的str是Bad Ptr。
    最近更新 更多