2010-10-23 3 views
4

Я создаю приложение iphone и использую C++, и у меня проблемы с проверкой, если указатель имеет значение null.Проверить нулевой указатель

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 является нулевым

+4

Я думаю, что 'myInterface' не хранит NULL, а некоторый указатель на мусор. – kennytm

+0

Что означает 'printf ("% p \ n ", myInterface)' print? – fredoverflow

ответ

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

Я думаю, что большинство людей согласятся, что 4-я форма не должна использоваться (это бессмысленно и затрудняет читаемость), но выбор между первыми 3 - это чисто вопрос стиля. –

+0

Каково ваше мнение об использовании nullptr (когда C++ Ox катится в город)? –

+0

@Martin: это лучше, чем 'NULL', но я не думаю, что это * достаточно * лучше, чем' NULL' для меня, чтобы использовать NULL сейчас, чтобы потом найти и заменить. AFAIK, преимущество, которое у него есть над «0», заключается в том, что использование его в RHS присвоения, инициализации или сравнения действует как бонус «static_assert (lhs - это указатель или bool)». В конечном итоге я могу найти это полезным, и я не возражаю против этого. Литералы на C++ всегда были и остаются очень слабо типизированными в целом.Я научился этому жить, поэтому это небольшое усиление меня не возбуждает. Я также не пишу '' \ 0'' для ASCII NUL. –

4

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

6

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

IMyInterface* myInterface = 0; 

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

IMyInterface* myInterface = new TypeImplementingInterface(); 

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

+0

Удивительный, вот что я искал. Спасибо. – user346443

Смежные вопросы