如何检查无效指针?

Posted

技术标签:

【中文标题】如何检查无效指针?【英文标题】:How do you check for an invalid pointer? 【发布时间】:2009-01-27 04:33:14 【问题描述】:

我目前的代码大意为:

if( objectPointer != NULL)
    delete objectPointer;

不起作用,因为指针被编译器设置为无效的十六进制数字,例如:

0xbaadf00d 0xdeadbeef

等等……

那么在尝试删除对象之前检查无效指针的最佳方法是什么?

【问题讨论】:

我认为编译器不会在你背后设置指针。创建时是否将 objectPointer 初始化为 0? @Mark - 我认为有一个编译器选项可以自动将内存初始化为已知模式,如 0xdeadbeef(尽管在这种特殊情况下可能是堆栈内存,而不是堆内存)。 @LeopardSkin,您正在考虑调试模式下的 Visual C++。它具有适用于所有不同类型分配的内存模式。 @Hazar:在 NULL 指针上使用 delete 是完全有效的(这是一个无操作),如果您要删除它,请不要检查它是否为 NULL。 @Evan - 你是对的,你不需要在删除之前进行 NULL 指针检查,但是在删除之后将指针设置为 NULL 很有用。 【参考方案1】:

始终将指针初始化为 NULL(即 0)。来自http://www.lysator.liu.se/c/c-faq/c-1.html

空指针在概念上与未初始化的指针不同。已知空指针不指向任何对象;未初始化的指针可能指向任何地方。

【讨论】:

【参考方案2】:

调用delete时不需要检查not-NULL。它被明确定义为什么都不做。

delete NULL; // this is allowed

您编写的任何正确代码都不会受到编译器放入未初始化或已释放内存的这些奇怪值的影响。它将这些值放在那里以帮助您找到错误。所以,你有一个错误。

【讨论】:

【参考方案3】:

如果它不指向任何东西,最好的方法是将它设置为 NULL。全局变量、其他命名空间中的指针和局部静态指针会自动初始化为空指针。如果您需要针对 NULL 测试类成员和普通本地变量,则应手动将它们初始化为 NULL(有些人喜欢使用 0 代替。当然,这是完全等效的)。

然后,您可以检查 NULL,但也可以立即将指针传递给 delete,因为删除空指针不会有任何影响(由 C++ 标准保证)。

【讨论】:

【参考方案4】:

你问错问题了。 您的指针不应该首先获得这些值。你不能依赖编译器来设置一个指向某个东西的无效指针。你总是需要通过为它分配一个 NULL 来自己做。

【讨论】:

【参考方案5】:

“在尝试删除对象之前检查无效指针”的最佳方法是永远不要尝试删除对象。所有对delete 的调用都应在拥有指向数据的对象的析构函数中执行。

标准库中充满了拥有此类所有权的对象,因此您几乎不需要自己实际编写一个。试试unique_ptrvectorshared_ptr 或任何其他适合您特定需求的容器。

【讨论】:

【参考方案6】:

在我发帖后找到this。

【讨论】:

以上是关于如何检查无效指针?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查会话是不是无效

如何检查触发器是不是无效?

如何检查接口是不是是指向切片的指针

我们如何检查指针是不是为 NULL 指针?

在 OnPaint() 事件中,如何检查给定的矩形是不是与无效区域相交?

Perl 6:如何检查`new`是否存在无效参数?