API返回类型--强制将智能指针指向用户
API return type -- Force a smart pointer onto the user?
假设我有一个API-border函数,它创建并返回一个对象:
<?> createOneObject();
将对象返回给调用者的最佳方式是什么?
- 返回原始
MyObject*
并让调用者自己处理指针 - 返回
std::shared_ptr<MyObject>
- 还有别的吗
取决于。
通常,返回原始指针是不好的,因为类型本身不传递所有权。用户应该删除指针吗?如果是,那么怎么做?如果没有,那么图书馆什么时候做?用户如何知道指针是否仍然有效?这些事情必须记录下来,懒惰的程序员可能会跳过阅读文档。但是,如果您的API必须可以从C或其他语言调用,那么原始指针可能是唯一的选择。
共享指针在特殊情况下可能很有用,但它们确实有开销。如果您不需要共享所有权,那么使用共享指针可能会有些过头。
唯一的指针是我会使用的,除非有特定的理由使用其他东西。
尽管如此,这还是假设首先应该返回一个指针。另一个很好的选择是返回一个对象。
更具体地说:我有一个播放器类,它只存储一个id,并提供了很多方法。在这种情况下,您更愿意按价值返回?
非常肯定。
您有两个选项(没有任何令人讨厌的缺点):
C样式
有一个匹配的void destroyOneObject(MyObject* object);
来清理资源。当销毁对象不像删除对象那么简单时(例如,需要在某个管理器类中注销),这是正确的选择。
智能指针
当只需要删除对象时,返回一个std::unique_ptr<MyObject>
。这使用RAII来清理对象,并且更适合现代C++。
糟糕的解决方案
不要返回原始指针并对其调用delete。您不能保证delete与用于创建对象的新指针匹配。如果你一开始就应该删除它,它也不会很好地沟通。
不要使用共享指针。在几乎任何情况下,它们都是完全高估的,通常是由于对应用程序结构缺乏了解造成的。
相关文章:
- 用户定义函数中的指针和输入
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 如何使用构造函数声明指向用户定义对象的指针?
- 有没有办法根据用户参数设置函数指针?
- 函数调用歧义(用户定义的转换和 Derived2Base 指针转换)
- 在C++库中,谁应该删除指针、用户或库?
- 如何使用指针将用户输入存储到向量中
- 通过用户输入到对象的指针的C 向量
- 编写安全包装类以管理用户定义对象的指针
- 如何保护类外用户可以修改的指针地址?C++
- 我在使用 cin.getline() 从用户那里获取 3 个字符串并使用指针数组来存储它们时遇到问题
- 智能指针的成员初始化列表,用于用户定义的结构
- API返回类型--强制将智能指针指向用户
- 使用指针对用户定义对象的C++数组进行排序
- 无法将指针定义为用户定义的类,但我可以直接实例化
- 用户定义类中的Null指针无效
- 是否可以编写一个自定义 STL 分配器,该分配器使用指向用户提供的分配函数的指针
- 用户定义的链表从函数返回指针
- 设置指向用户输入C++的指针
- 获取用户输入并将其存储到指针数组中