【问题标题】:C++: Validate a pointer? [duplicate]C++:验证指针? [复制]
【发布时间】:2010-06-17 17:57:54
【问题描述】:

可能重复:
Testing pointers for validity (C/C++)

如果我有一个指针,比如char* foo,有没有办法确定foo 是否指向内存中的有效位置? (所以,foo 不是 NULL,并且尚未调用 delete。)

【问题讨论】:

  • 您可以在拨打delete时将其设置为NULL
  • 最好是首先摆脱指针。把它放在一个可以在其整个生命周期内使用的智能指针中,那么这个问题就是微不足道的“是”。如果你不能这样做,那么就摆脱可能有一个无效指针的机会。 delete时不要设置为NULL,去掉指针!
  • 将指针设置为NULL(或任何其他“摆脱它”的方法)不会处理指针可能具有的任何别名;唯一正确的答案是“不”。
  • @Tyler:GMan 建议使用智能指针,它具有重载的复制和赋值构造函数,因此别名不是问题。在这种情况下,“摆脱它”意味着让它超出范围并正确解决问题。

标签: c++ validation memory-management pointers


【解决方案1】:

不,没有。

【讨论】:

    【解决方案2】:

    没有。确保您不使用dangling pointers 几乎是您的责任。 但是,该链接推荐的一种做法(我看到有些人使用它,其他人讨厌它)是在释放/删除它之后立即将指针设置为NULL

    【讨论】:

      【解决方案3】:

      不以任何独立于实现的方式。

      如果知道堆管理器的实现细节,可以遍历堆块并验证指针是有效的堆块。

      但这会很慢并且(非常)依赖于实现;它很可能无法跨编译器版本工作,更不用说跨同一操作系统上的不同编译器了,当然也不能跨不同的操作系统。

      最好使用 RAII 或智能指针之类的东西来确保指针有效或为 NULL。

      【讨论】:

      • 即使那样你也不知道它是否指向任何人认为它所做的事情。
      • Enh - 你可以检查尺寸和其他一些东西,但是是的,那里没有类型数据......
      【解决方案4】:

      您无法确定 foo 是否指向有效位置,但您可以做很多事情来确保是这种情况(尤其是 RAII)。

      【讨论】:

        【解决方案5】:

        如果你能确定这样的事情,那就意味着有额外的膨胀和开销,99.999% 的时间都不需要,这与 C++ 的原则背道而驰。

        如果您担心这类事情,请使用 boost::shared_ptr。

        【讨论】:

          【解决方案6】:

          这不漂亮,我不会这样做,因为我更喜欢使用智能指针,但这里有一些旧式代码。

          有效位置

          我看到了一次有效的有趣定义。 如果您可以访问它 - 比如说通过使用它,那么它是有效的。您可以捕获访问失败时引发的异常,因此您可以定义它是否有效。在这种情况下有效,表示“可访问”,但未定义任何关于类型的内容。

          valid_ptr( void * validate ) {
            try {
               int foo = *(int *)validate;
               return true;
            }
            catch(...){}
            return false;
          }
          

          这保证了您的应用程序当前可以读取内存,这并不意味着您的类型特定指针指向该类型的对象。

          也许此方法的较新版本也将使用 dynamic_cast 等来验证类型以及尝试使用 RTTI 信息。

          【讨论】:

          • 不起作用。如果指针无效,一般不会抛出异常。
          • C++ 不要求抛出任何异常,你得到的只是未定义的行为。 (这在某些平台上意味着崩溃或抛出异常。)
          • 它在 Windows XP 或更早的系统上使用过,但正如你所说的 undefined 用于一般用途。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-27
          相关资源
          最近更新 更多