Аргумент функции в качестве ссылки, чтобы избежать проверки на NULL - PullRequest
3 голосов
/ 29 мая 2011

Если у меня есть функция, которая принимает указатель, который никогда не должен быть НЕДЕЙСТВИТЕЛЕН, я обычно делаю что-то вроде этого:

void Foo(const somePointer* ptr)
{
  if (ptr == NULL)
  {
    // Throw assertion
    return;
  }

  // Do something
}

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

void Foo(const somePointer& ptr)
{
  // No need to check anymore, client is responsible

  // Do something
}

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

Ответы [ 3 ]

5 голосов
/ 29 мая 2011

Что ж, если вы никогда не хотите, чтобы несуществующий объект передавался, используйте ссылку (Примечание: не существует, не недействителен).
Если вы хотите такую ​​возможность, используйте указатель.

4 голосов
/ 29 мая 2011

Я думаю, что это бесполезно как проверка безопасности.Однако, как документация, это немного стоит*

Теперь, если ptr было нулевым, то первый код был недействительным, и это была их ошибка в передаче нулевого значения в функцию, параметр которой "никогда не должен быть НЕДЕЙСТВИТЕЛЕН".Второй код также недействителен, и он виноват в том, что разыменовал нулевой указатель.

Это полезно в качестве документации, в том случае, если при вводе символа * они подумают: «О, подождите,это лучше не быть нулевым ".Принимая во внимание, что если все, что вы сделали, - это документ, в котором null является недопустимым вводом (как, скажем, strlen делает), то им пришлось бы читать документацию, чтобы знать, как не передавать нулевой указатель.Теоретически, пользователь вашего кода будет проверять документы вместо того, чтобы просто толкать клавиатуру лицом, пока у него не будет что-то, что компилируется, и предполагается, что это сработает.На практике у всех нас есть свои менее разумные моменты.

4 голосов
/ 29 мая 2011

Многое зависит от формы вашего кода - если вы напишите много таких вещей:

A * a = new A();
f( a );

тогда для f () кажется разумным взять указатель, а не писать:

f( *a );

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...