对于C ++,当我们检查指针是否有效时,通常我们会执行以下操作:
if (p == NULL){
// error handling
}
但是,在VC ++中,即使 p 不是NULL(也就是0),它是 0x00000004 ,也意味着 Bad Ptr 。然后导致异常,我们知道这个地址是受保护的,不能被覆盖。
我在这里搜索过类似的问题,但我没有得到答案。
我的问题是:
答案 0 :(得分:7)
在Windows中,虚拟内存地址空间中的前65536个字节(地址0x00000000到0x0000FFFF)始终未映射,从而无法寻址RAM。一种功能,可确保错误的指针值始终使用AccessViolation使程序崩溃。最常见的原因是NULL指针,但是空指针并不专门产生对地址0的访问。例如,在面向对象的编程语言(如C ++)中,尝试通过空指针访问对象的成员会生成对更大地址的访问比对象内部成员的偏移量大。
这不是调试器停止的地方,您还会在其他地址上看到Bad Ptr,这是引用未映射的内存页面的类型。并且,如果取消引用,也会使您的程序崩溃。开始使用调试器的一个很好的理由。但不是你的情况,0x00000004已被底部的禁区覆盖。
winapi具有测试指针值是否为坏的功能。我不打算记录它们,这些函数are dangerous。
像这样的指针值总是代码中的错误。你必须修复这个错误。
答案 1 :(得分:3)
0
,这意味着指针无效(地址无效,如包含垃圾,或地址有效但不属于您的程序等)。 0
或NULL
是一个特殊情况。在声明指针时,应始终初始化指针,使用有效地址或nullptr
。然后,您可以在使用前检查if(p==nullptr)
。
例如
int* p = reinterpret_cast<int*>(100);
此处p
不是NULL
,但它指向的地址无效。