English 中文(简体)
你如何检查无效指针?
原标题:
  • 时间:2009-01-27 04:33:14
  •  标签:

我目前的代码的效果是:

if( objectPointer != NULL){
    delete objectPointer;
}

不工作是因为编译器将指针设置为无效的十六进制数,例如:

  • 0xbaadf00d
  • 0xdeadbeef

等等......

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

最佳回答

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

空指针从概念上与未初始化的指针不同。空指针被认为不指向任何对象;未初始化的指针可能指向任何地方。

问题回答

在调用 delete 时,不需要检查非 NULL。它被明确定义为不执行任何操作。

delete NULL; // this is allowed

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

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

然后,您可以针对NULL进行检查,但也可以直接将指针传递给delete,因为删除null指针不会产生任何影响(由C++标准保证)。

You re asking the wrong question.
Your pointers should never be getting these values in the first place. you can t rely on the compiler to set an invalid pointer to something. you always need to do it yourself by assigning a NULL to it.

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

标准库充满了能够执行所有权操作的对象,因此您几乎永远不需要自己编写一个。尝试使用unique_ptrvectorshared_ptr或适合您特定需求的其他容器。

在我发帖后,找到了这个





相关问题
热门标签