如何检查指针是否有效?

21 c winapi pointers

我很清楚这个问题的丑陋,我还是想知道它是否可能:

当程序尝试读取/写入无效指针(NULL,未分配的块等)时,窗口会使应用程序崩溃并发生访问冲突异常.

问题是,有没有办法检查这个指针在尝试使用它之前会产生异常,否则,有没有办法捕获这个异常?

laa*_*lto 12

抓住这种错误是解决症状,而不是根本原因.

以下习语适用于任何平台:

  • 将所有指针初始化为零

  • 如果您不能保证指针有效,请在指向它之前检查它是否为非0

  • 删除对象时,删除后将指针设置为0

  • 将指针传递给其他函数时要小心对象所有权问题


Bri*_*ndy 10

如果必须使用原始指针,最好的办法是确保它是有效指针或NULL.然后,您可以通过检查它是否等于NULL来检查它是否有效.

但是要回答你的问题,你可以通过结构化异常处理(SEH)捕获这些类型的东西.

话虽这么说,SEH是一个坏主意.


ava*_*kar 8

有功能IsBadReadPtrIsBadWritePtr可能做你想做的.还有一篇文章解释了为什么不应该使用它们.

  • 来自MSDN:"重要:此函数已过时,不应使用.尽管它的名称,但它并不保证指针有效或指向的内存可以安全使用." (2认同)

小智 5

你当然可以测试指针是否为NULL!

if ( ptr == NULL ) {
   // don't use it
}
Run Code Online (Sandbox Code Playgroud)

这是您可以做的唯一便携式测试.Windows确实提供了各种API来测试指针,但正如其他人指出的那样,使用它们可能会有问题.