C++ C++;:验证指针?

C++ C++;:验证指针?,c++,validation,memory-management,pointers,C++,Validation,Memory Management,Pointers,可能重复: 如果我有一个指针,比如char*foo,有没有办法确定foo是否指向内存中的有效位置?(因此,foo不是NULL,并且还没有对其调用delete。不,没有。不。确保不使用。 然而,该链接推荐的一种做法(我看到一些人使用它,其他人讨厌它)是在释放/删除它后立即将指针设置为NULL 您无法确定foo是否指向有效位置,但您可以做很多事情来确保这一点(尤其是RAII)。不是以任何独立于实现的方式 如果知道堆管理器的实现细节,就可以遍历堆块并验证指针是否是有效的堆块 但这将是缓慢和(极端)依

可能重复:


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

不,没有。

不。确保不使用。
然而,该链接推荐的一种做法(我看到一些人使用它,其他人讨厌它)是在释放/删除它后立即将指针设置为
NULL

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

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

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

但这将是缓慢和(极端)依赖于实施的;它很可能不会跨编译器版本工作,更不用说跨同一操作系统上的不同编译器了,当然也不会跨不同的操作系统工作


<> p>最好是用C++或智能指针之类的方法来保证指针是有效的或空的。

如果你能确定这样的事情,那就意味着额外的膨胀和开销不需要99.999%的时间,这违背了C++的原理。
如果您担心这类问题,请使用boost::shared\u ptr。

这不太好,我不会这样做,因为我更喜欢使用智能指针,但这里有一些老式代码

有效位置

我曾经看到一个有趣的valid定义。 如果你可以访问它,比如说通过使用它,那么它是有效的。您可以捕获访问失败时引发的异常,因此可以定义它是否有效。在本例中有效,表示“可访问”,但不定义任何有关类型的内容

valid_ptr( void * validate ) {
  try {
     int foo = *(int *)validate;
     return true;
  }
  catch(...){}
  return false;
}
这表明你的应用程序当前可以读取内存,但并不意味着你的特定类型指针指向该类型的对象


也许此方法的较新版本也会使用动态强制转换或类似的方法来验证类型,同时尝试使用RTTI信息。

当调用
delete
时,可以将其设置为
NULL
。最好的方法是首先去掉指针。把它放在一个智能指针中,这个指针在它的整个生命周期内都是可用的,那么问题就是“是”。如果您不能做到这一点,那么就不要再有可能拥有无效指针的机会。当您
删除时,不要将其设置为
NULL
,请去掉指针!将指针设置为
NULL
(或任何其他“摆脱它”的方法)不会处理指针可能具有的任何别名;唯一正确的答案是“否”。Dupe of等。@Tyler:GMan建议使用智能指针,智能指针具有重载的复制和赋值构造函数,因此别名不是问题。在这种情况下,“摆脱它”意味着让它超出范围并正确地解决问题。即使这样,你也不知道它是否指出了任何人认为它做了什么。恩-你可以检查大小和其他一些事情,但是的,那里没有类型数据…不起作用。一般来说,如果指针无效,则不会抛出异常。C++不强制抛出任何异常,所有得到的都是未定义的行为。(在某些平台上,这意味着崩溃或引发异常。)它在Windows XP或更早的系统上使用过,但正如您所说的,对于一般用途,它是未定义的。