23 June 2022

C++ 核心指南目录

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

强化

  • 标记用 deletestd::free() 操作T*的代码,只有对象所有者才能删除对象。
  • 标记 newmalloc() 生成的对象赋值给T*的代码,只有对象所有者负责删除对象。