【问题标题】:How to check if a pointer is valid? [duplicate]如何检查指针是否有效? [复制]
【发布时间】:2010-11-02 20:39:20
【问题描述】:

我很清楚这个问题的丑陋,我仍然想知道是否可以:

当程序尝试读取/写入无效指针(NULL、未分配块等)时,Windows 会因访问冲突异常而导致应用程序崩溃。

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

【问题讨论】:

标签: c windows pointers winapi


【解决方案1】:

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

但要回答您的问题,您可以通过structured exception handling (SEH) 了解这些内容。

话虽如此,SEH is a bad idea

【讨论】:

  • 在 c 中,当我创建一个像 int *n = (int*)malloc(_SIZE_*sizeof(int)); 这样的指针,然后我检查它的 NULL 是否打印一条消息说它的 NULL 但它不会打印,即使我删除了 malloc 函数并且我只是把像int *n; 这样的指针仍然说它不为空。那么在使用 malloc 函数之前我必须初始化为 NULL 吗?
  • 博客链接坏了;我认为 this one 是正确的,但日期与旧 URL 中的日期不匹配,而且我找不到该日期的博客文章。我可以编辑答案,但我想获得第二个意见。
【解决方案2】:

发现此类错误只是解决症状,而不是根本原因。

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

  • 将所有指针初始化为零

  • 如果你不能保证一个指针是有效的,在间接它之前检查它是否为非0

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

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

【讨论】:

    【解决方案3】:

    IsBadReadPtrIsBadWritePtr 函数可以满足您的需求。还有an article 解释了为什么你不应该使用它们。

    【讨论】:

    • 来自 MSDN:“重要提示:此函数已过时,不应使用。尽管名称如此,但它不能保证指针有效或指向的内存可以安全使用。”
    • Hammer,是的,它们被标记为过时,我链接到的文章解释了原因。无论如何,你想要达到什么目的?
    【解决方案4】:

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

    if ( ptr == NULL ) {
       // don't use it
    }
    

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

    【讨论】:

      【解决方案5】:

      【讨论】:

      • 我知道有 IsBadRead/WritePtr,找不到有效版本。但是,MSDN 说它们已经过时了
      • @Hammer:对不起,我的意思是“坏”,现在已修复。它们被认为是不好的形式,因为它们不是线程安全的,但它们最接近 OP 的要求。
      【解决方案6】:

      我认为您正在寻找类似 IsBadReadPtr 的东西。

      文档:

      http://msdn.microsoft.com/en-us/library/aa366713(VS.85).aspx

      【讨论】:

        【解决方案7】:

        我不了解 Windows,但在 *nix 中您可以安装 SIGSEGV 信号处理程序来拦截异常。

        【讨论】:

        • 在 Windows 上,您可以编写结构化异常处理程序来捕获异常。
        • 信号处理不是 *nix 特有的:它是 ISO-C 标准库的一部分
        • 这并没有多大帮助:在 SIGSEGV 处理程序完成后,程序执行返回的位置与信号的根本原因所在的位置完全相同。除非您不退出信号处理程序,否则您将创建一个无限循环。因此,一般来说,捕获 SIGSEGV 是个坏主意。
        猜你喜欢
        • 2016-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-05
        相关资源
        最近更新 更多