检查空指针

use*_*443 4 c++ null pointers

我正在构建一个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)子句都被执行了),那么你的程序中的其他地方就会出现一些非常错误.这些测试具有相反的含义,因此它们两者都将显示为真的唯一方法是当未定义的事情发生时.


Jam*_*lis 6

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

IMyInterface* myInterface = 0;
Run Code Online (Sandbox Code Playgroud)

或者,如果可以,通常最好在声明变量时将变量初始化为有效状态:

IMyInterface* myInterface = new TypeImplementingInterface();
Run Code Online (Sandbox Code Playgroud)

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