检查空指针

4

我正在开发一款 iPhone 应用程序,使用的是 C++,但是在检查指针是否为空时遇到了麻烦。

IMyInterface* myInterface;

if ( !myInterface ){                         //doesn't work
     myInterfacee->doSometing(); 
}

if ( myInterface != 0 ) {                    //doesn't work 
     myInterfacee->doSometing(); 
}

if ( myInterface != NULL ){                  //doesn't work
     myInterfacee->doSometing(); 
}

if ( myInterface != ( myInterface* )0 ) {    //doesn't work 
     myInterfacee->doSometing(); 
}

如果设置了myInterface或者没有设置,它仍会进入每个语句并且给我一个"Program received signal: “EXC_BAD_ACCESS”"。

我该如何检查myInterface是否为空?


4
我认为myInterface并没有存储NULL,而是一些垃圾指针。 - kennytm
printf("%p\n", myInterface) 打印的是什么? - fredoverflow
3个回答

17

你的基本问题在于,你没有初始化myInterface

假设 myInterfacee 只是一个打字错误,以下所有方式都可以正常运行,且不会调用 doSometing

IMyInterface* myInterface = 0;

if ( myInterface ){                // ! removed
     myInterface->doSometing(); 
}

if ( myInterface != 0 ) {          // as before
     myInterface->doSometing(); 
}

if ( myInterface != NULL ){        // as before
    myInterface->doSometing(); 
}

if ( myInterface != ( IMyInterface* )0 ) { // IMyInterface, not myInterface
     myInterface->doSometing(); 
}

就我个人而言,我更喜欢前两种而不太喜欢第四种,但这是风格问题而非正确性问题。

无论myInterface 是否被设置,它都会进入每个语句

我有点怀疑这一点,但如果真是这样(你正在初始化 myInterface ,但仍然看到 if(!myInterface) if(myInterface!= 0)子句都被执行),那么你的程序中其他地方肯定出了严重问题。 这些测试具有相反的含义,因此它们同时为真的唯一方法是发生了未定义的情况。


1
我认为大多数人会同意第四种形式不应该被使用(它是毫无意义的,而且会妨碍可读性),但前三种选择纯粹是风格问题。 - Adam Rosenfield
当 C++Ox 出现时,你如何看待使用 nullptr? - Martin York
@Martin:它比NULL好,但我认为它并不比NULL更好到足以让我现在使用NULL然后再查找和替换。据我所知,它比0的好处是,在赋值、初始化或比较的右手边使用它会作为一个额外的“static_assert(lhs is a pointer or bool)”奖励。我可能最终会发现它有用,而且我也没有反对意见。在C++中,字面量通常是弱类型的,这一点一直如此,也将保持不变。我已经学会了与此共存,所以这个小小的加强并没有激起我的兴趣。我也不写'\0'来表示ASCII NUL。 - Steve Jessop
在赋值和比较中,使用正确类型的字面量作为函数参数是很好的习惯,以防万一出现重载或类型推导。我期望我会养成在调用允许空指针的指针函数时使用nullptr的习惯,比如snprintf。虽然我不经常在C++中调用snprintf(而且我也不指望它被重载,只是一个例子),但这个习惯可能会让我开始在其他地方也使用nullptr - Steve Jessop
第一种形式适用于提供廉价bool强制转换的类似指针的对象。另外几种形式需要将类似指针的对象强制转换为实际指针进行比较,这可能比第一种形式隐含的简单存在测试更昂贵。我强烈偏好第一种形式。 - RBerteig

6

你没有初始化myInterface,因此它的值是不确定的。你需要将其初始化为null:

IMyInterface* myInterface = 0;

或者,如果可以的话,在声明变量时将其初始化为有效状态通常是更好的选择:

IMyInterface* myInterface = new TypeImplementingInterface();

您还应该考虑使用某种智能指针,例如shared_ptr; 智能指针可以使C++中的内存管理变得更加简单。


4

你的问题是指针默认情况下不会自动初始化为NULL。你所使用的所有方法都应该能够运行,但是在定义变量时需要将其初始化为NULL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接