代码之家  ›  专栏  ›  技术社区  ›  DShook

如何检查无效指针?

  •  12
  • DShook  · 技术社区  · 17 年前

    我当前的代码影响:

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

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

    • 0xBAADF000
    • 死牛肉

    等。。。。

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

    6 回复  |  直到 14 年前
        1
  •  31
  •   Brett Daniel    17 年前

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

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

        2
  •  13
  •   1800 INFORMATION    17 年前

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

    delete NULL; // this is allowed
    

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

        3
  •  10
  •   Johannes Schaub - litb    17 年前

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

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

        4
  •  3
  •   shoosh    17 年前

    你问错了问题。
    您的指针不应该首先获取这些值。不能依赖编译器设置指向某个对象的无效指针。您总是需要通过给它分配一个空值来自己完成它。

        5
  •  1
  •   Mankarse    14 年前

    “尝试删除对象之前检查无效指针”的最佳方法是从不尝试删除对象。所有的呼叫 delete 应该在拥有指向数据的对象的析构函数中执行。

    标准库中充满了这样的拥有权的对象,因此您几乎不需要亲自编写一个。尝试 unique_ptr , vector , shared_ptr 或其他适合您特殊需要的容器。

        6
  •  0
  •   Community Mohan Dere    9 年前

    建立 this 我也张贴了。