我正在构建一个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();
}
Run Code Online (Sandbox Code Playgroud)
如果myInterface设置或未设置,它仍会进入每个语句并给我
程序接收信号:"EXC_BAD_ACCESS".
我如何检查myInterface是否为空
Ste*_*sop 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();
}
Run Code Online (Sandbox Code Playgroud)
就个人而言,我更喜欢前三个,而不喜欢第四个,但这是一个风格而不是正确的问题.
如果设置或未设置myInterface,它仍会进入每个语句
我有点不相信这一点,但如果确实如此(你正在初始化myInterface,并且仍然看到这两个if (!myInterface)和if (myInterface != 0)子句都被执行了),那么你的程序中的其他地方就会出现一些非常错误.这些测试具有相反的含义,因此它们两者都将显示为真的唯一方法是当未定义的事情发生时.
您没有初始化myInterface,因此它的值是不确定的.您需要将其初始化为null:
IMyInterface* myInterface = 0;
Run Code Online (Sandbox Code Playgroud)
或者,如果可以,通常最好在声明变量时将变量初始化为有效状态:
IMyInterface* myInterface = new TypeImplementingInterface();
Run Code Online (Sandbox Code Playgroud)
您还应该考虑使用某种智能指针,例如shared_ptr; 智能指针使C++中的内存管理变得更加简单.