Проверка на нулевое значение перед использованием указателя - PullRequest
11 голосов
/ 17 декабря 2009

Большинство людей используют такие указатели ...

if ( p != NULL ) {
  DoWhateverWithP();
}

Однако, если указатель равен нулю по какой-либо причине, функция вызываться не будет.

Мой вопрос: может быть, было бы выгоднее просто не проверять NULL? Очевидно, что для систем, критичных для безопасности, это не вариант, но сбой вашей программы в лучах славы более очевиден, чем функция, которая не вызывается, если программа все еще может работать без нее.

Что касается первого вопроса, всегда ли вы проверяете NULL перед использованием указателей?

Во-вторых, представьте, что у вас есть функция, которая принимает указатель в качестве аргумента, и вы используете эту функцию несколько раз для нескольких указателей в вашей программе. Считаете ли вы более полезным тестировать NULL в функции (преимущество заключается в том, что вам не нужно проверять NULL повсеместно) или на указателе перед вызовом функции (преимущество заключается в отсутствии дополнительных затрат при вызове функции? )

Ответы [ 13 ]

0 голосов
/ 17 декабря 2009

Может быть, было бы выгоднее просто не проверять NULL?

Я бы этого не сделал, я предпочитаю утверждения на передовой и некоторую форму восстановления организма после этого. Что могли бы дать вам утверждения , а не , что не проверка на нуль? Аналогичный эффект, с более легкой интерпретацией и формальным подтверждением.

Что касается первого вопроса, всегда ли вы проверяете NULL перед использованием указателей?

Это действительно зависит от кода и доступного времени, но я раздражительно хорош в этом; Хорошая часть «реализации» в моих программах состоит из того, что программа должна не делать, а не из обычного «что она должна делать».

Во-вторых, представьте, что у вас есть функция, которая принимает указатель в качестве аргумента ...

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

0 голосов
/ 17 декабря 2009

Что ж, ответ на первый вопрос: вы говорите об идеальной ситуации, большая часть кода, который я вижу, который использует if ( p != NULL ), является устаревшей. Также предположим, что вы хотите вернуть оценщик, а затем вызвать оценщик с данными, но скажите, что для этих данных нет оценщика, логично иметь смысл возвращать NULL и проверять NULL перед вызовом оценщика.

Ответ на второй вопрос заключается в том, что это зависит от ситуации, например, проверки удаления для указателя NULL, тогда как многие другие функции этого не делают. Иногда, если вы проверяете указатель внутри функции, вам может потребоваться проверить его во многих функциях, таких как:

ABC(p);
a = DEF(p);
d = GHI(a);
JKL(p, d);

но этот код был бы намного лучше:

if(p)
{
 ABC(p);
 a = DEF(p);
 d = GHI(a);
 JKL(p, d);
}
0 голосов
/ 17 декабря 2009

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

if (NULL == p)
{
  goto FunctionExit; // or some other common label to exit the function.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...