Проверить нулевой указатель - PullRequest
4 голосов
/ 23 октября 2010

Я создаю приложение для 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 установлен или не установлен, он все равно входит в каждый оператор и дает мне

Программа получила сигнал: «EXC_BAD_ACCESS».

Как мне проверить, является ли myInterface нулевым

Ответы [ 3 ]

17 голосов
/ 23 октября 2010

Ваша основная проблема в том, что вы не инициализировали 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)), то в другом месте что-то очень неправильно в вашей программе. Эти тесты имеют противоположные значения, поэтому единственный способ, которым они оба будут казаться истинными, - это когда происходит нечто неопределенное.

6 голосов
/ 23 октября 2010

Вы не инициализируете myInterface, поэтому его значение не определено. Вам нужно инициализировать его как null:

IMyInterface* myInterface = 0;

Или, если вы можете, обычно предпочтительнее инициализировать переменную в допустимое состояние, когда вы объявляете ее:

IMyInterface* myInterface = new TypeImplementingInterface();

Вам также следует рассмотреть возможность использования умных указателей, например, shared_ptr; умные указатели значительно упрощают управление памятью в C ++.

4 голосов
/ 23 октября 2010

Ваша проблема в том, что по умолчанию указатели не инициализируются в NULL. Все методы, которые у вас есть, должны работать, но вам нужно будет инициализировать вашу переменную как NULL, когда вы ее определите.

...