我目前的代码效果:
if( objectPointer != NULL){
delete objectPointer;
}
不起作用,因为编译器将指针设置为无效的十六进制数,例如:
等...
那么在尝试删除对象之前检查无效指针的最佳方法是什么?
答案 0 :(得分:31)
始终将指针初始化为NULL(即0)。来自http://www.lysator.liu.se/c/c-faq/c-1.html:
空指针在概念上与未初始化的指针不同。已知空指针不指向任何对象;未初始化的指针可能指向任何位置。
答案 1 :(得分:13)
调用delete时,不需要检查not-NULL。明确定义它什么都不做。
delete NULL; // this is allowed
您编写的任何正确代码都不会受到编译器放入未初始化或已释放内存的这些奇怪值的影响。它将这些值放在那里,以帮助您找到错误。你好,你有一个错误。
答案 2 :(得分:10)
如果它没有指向任何东西,最好的方法是将其设置为NULL。 Globals,其他命名空间中的指针和本地静态指针会自动初始化为空指针。如果你需要针对NULL测试它们,那么类成员和普通本地应该手动初始化为NULL(有些人喜欢使用0
。当然,这完全等效)。
然后,您可以检查NULL,但也可以立即将指针传递给delete
,因为它对删除空指针没有任何影响(由C ++标准保证)。
答案 3 :(得分:3)
你问错了。
你的指针永远不应该首先得到这些值。你不能依赖编译器来设置一个无效的指针。你总是需要通过为它分配一个NULL来自己做。
答案 4 :(得分:1)
“在尝试删除对象之前检查无效指针”的最佳方法是永远不要尝试删除对象。对delete
的所有调用都应该在拥有指向数据的对象的析构函数中执行。
标准库中充满了拥有此类所有权的对象,因此您几乎不需要自己实际编写一个。试试unique_ptr
,vector
,shared_ptr
或其他适合您特定需求的容器。
答案 5 :(得分:0)
在我发布后发现this。