CppCoreGuidelines I.12 用 not_null 声明不能为 null 的指针
25 March 2022
I.12: Declare a pointer that must not be null as not_null
理由
- 避免对空指针进行取值操作,导致错误。
- 无需对空指针进行多余检查,提升性能。
例子
int length(const char* p); // 不清楚 length(nullptr) 是否正确 length(nullptr); // OK?
以上例子,我们无从判断参数 p
的取值能否是空指针。
int length(not_null<const char*> p); // 更好:可以认为 p 非空 int length(const char* p); // p 可以是空指针
在代码中清晰表明代码的意图,可以让软件工程师和以及相关工具提供更明确的诊断信息。比如可以通过静态检测工具发现某些错误。还可以提升性能,比如减少因为判断指针是否为空的产生的逻辑分支。
注意
GSL 中定义了 not_null
注意
const char*
这种指向 char
的指针用来表示 C 风格的以\0
结束的字符串。这种用法不太直接,容易误解和出错。建议使用 czstring
。
// we can assume that p cannot be nullptr // we can assume that p points to a zero-terminated array of characters int length(not_null<zstring> p);
注意
这里length()
只是举个例子,实际代码中应该用标准库里的 std::strlen()
强化
- (简单,基础)如果函数会在各种分支中检查传入参数的指针是否为空指针。建议把参数声明为
not_null
。 - (复杂)如果函数在各个返回路径都要确保返回的不是空指针,建议把返回类型声明为
not_null