CppCoreGuidelines F.22 用 T* 或 owner 表示单个对象
07 June 2022
F.22: Use T*
or owner<T*>
to designate a single object
理由
可读性好:使得指针的意义更清晰。可以更好的利用工具提供的支持优化代码。
注意
传统 C 和 C++ 代码,用到很多T*
这样的指针:
- 表示一个(单独)对象(不会在函数中删除)
- 指向自由存储区分配的对象(之后会删除)
- 一个
nullptr
指针 - 表示一个 C 风格的字符串(空字符结尾的字符数组)
- 表示一个数组,长度则是另外一个变量指定
- 表示在数组中的一个位置
指针的使用场景太多,导致代码的意图越来越难理解。代码检测工具也很难提供支持。
例子
void use(int* p, int n, char* s, int* q) { p[n - 1] = 666; // Bad: we don't know if p points to n elements; // assume it does not or use span<int> cout << s; // Bad: we don't know if that s points to a // zero-terminated array of char; // assume it does not or use zstring delete q; // Bad: we don't know if *q is allocated // on the free store; // assume it does not or use owner }
改进后:
void use2(span<int> p, zstring s, owner<int*> q) { p[p.size() - 1] = 666; // OK, a range error can be caught cout << s; // OK delete q; // OK }
注意
owner<T*>
表示所有权, zstring
表示 C 风格的字符串。
相关指南:I.13 不要以单独指针传递数组
强化
- (简单)(约束)任何最终结果依然是指针的指针的运算操作。警告。