函数参数作为引用,以避免检查NULL
Function argument as reference to avoid checking for NULL
如果我有一个函数接收一个永远不应该为NULL的指针,我通常会这样做:
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
}
在我这样做之前(或者不这样做,取决于我在这里得到的答案),我想我会在这里问,看看每个人都会说什么,尤其是利弊。
如果您从不希望传入不存在的对象,请使用引用(注意:不存在,无效)
如果你想要这种可能性,就用一个指针。
很大程度上取决于代码的形状——如果你写了很多这样的东西:
A * a = new A();
f( a );
那么f()取一个指针似乎是明智的,而不是必须写:
f( *a );
就我个人而言,我几乎从不检查NULL,新的不能退货,如果你发现你有一个,你可能已经在UB了。
我认为这作为一项安全检查毫无意义。不过,作为文档,它的价值微乎其微。
如果你做了改变,所有的事情都会发生,一些用户会改变这个代码:
somePointer *ptr = something();
Foo(ptr);
对此:
somePointer *ptr = something();
Foo(*ptr);
现在,如果ptr
为null,那么第一个代码是无效的,这是他们将null传递给参数"永远不应该为null"的函数的错误。第二个代码也是无效的,这是他们取消引用空指针的错误。
它作为文档很有用,因为当他们键入*
字符时,他们可能会想,"哦,等一下,这个最好不要为空"。然而,如果您所做的只是文档中的null是无效输入(比如strlen
),那么他们必须阅读文档才能知道不要传入null指针。理论上,代码的用户会检查文档,而不是只是用脸捣碎键盘,直到他有了可以编译的东西,并假设这会起作用。在实践中,我们都有不那么聪明的时刻。
相关文章:
- 检查字符串是否"null" C++
- C++,检查当我无法使用 NULL/0 时是否初始化了变量
- 类返回对象类型,但如何返回和检查 null
- C++如何将结构数组初始化为null,然后在while循环中检查该数组的元素是否为null
- 我可以根据null或特定类型的值检查引用吗
- 如何避免对具有组合关系的Object进行null检查
- EXC_BAD_ACCESS当我尝试检查 NULL 时
- 从多个来源检查NULL:共享_ptr vs double指针
- boost :: asio :: io_service检查是否为null
- 我如何检查该点动态分配的单指针是否为null
- 检查指针是否为null,然后在同一if语句中取消引用它,这样安全吗
- 为什么strlen()比手动循环检查以null结尾的字符快20倍
- NULL /空字符串检查:CPU开销
- NULL指针检查线程安全
- 如果我无法访问字符串变量,如何检查 NULL(空/0) 字符串
- 我应该检查NULL在我的赋值操作符
- 在模板类中使用c++宏检查null
- Qt或C++检查NULL条件
- 函数参数作为引用,以避免检查NULL
- 为什么要根据ISO C++避免在新的之后检查null