如果我有一个指针,如char* foo
,有没有办法确定foo
是否指向内存中的有效位置? (因此,foo
不是NULL
,并且尚未调用delete
。)
答案 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信息。