C ++:验证指针?

时间:2010-06-17 17:57:54

标签: c++ validation memory-management pointers

  

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

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

6 个答案:

答案 0 :(得分:15)

不,没有。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

不以任何与实现无关的方式。

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

但这将是缓慢的,并且(非常)依赖于实现;它很可能不适用于编译器版本,更不用说在同一操作系统上的不同编译器之间,当然也不适用于不同的操作系统。

使用类似RAII或智能指针的方法确保指针有效或为NULL要好得多。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

  

有效位置

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

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

这个garauntees内存当前是你的应用程序可读的,它并不意味着你的类型特定指针指向该类型的对象。

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