CppCoreGuidelines F.42 返回 T* 表示一个内存地址
23 June 2022
F.42: Return a T*
to indicate a position (only)
理由
只有返回内存地址的情况下,可以使用指针。不可以用T*
返回所有权。
例子
Node* find(Node* t, const string& s) // find s in a binary tree of Nodes { if (!t || t->name == s) return t; if ((auto p = find(t->left, s))) return p; if ((auto p = find(t->right, s))) return p; return nullptr; }
如果上面函数返回值不是 nullptr
就表示一个节点字符串是 s
的节点地址。重要的是,这里没有转移指针所指向的对象的所有权。
注意
位置信息也可以通过迭代器 iterator
,索引 index
和引用 reference
传递。如果不考虑 nullptr
或不修改对象数据,引用比指针更好。
注意
返回的指针不能指向函数调用方作用域范围外的对象。see F43
强化
- 标记用
delete
,std::free()
操作T*
的代码,只有对象所有者才能删除对象。 - 标记
new
或malloc()
生成的对象赋值给T*
的代码,只有对象所有者负责删除对象。