API返回类型--强制将智能指针指向用户

API return type -- Force a smart pointer onto the user?

本文关键字:指针 用户 智能 返回类型 API      更新时间:2023-10-16

假设我有一个API-border函数,它创建并返回一个对象:

<?> createOneObject();

将对象返回给调用者的最佳方式是什么?

  • 返回原始MyObject*并让调用者自己处理指针
  • 返回std::shared_ptr<MyObject>
  • 还有别的吗

取决于。

通常,返回原始指针是不好的,因为类型本身不传递所有权。用户应该删除指针吗?如果是,那么怎么做?如果没有,那么图书馆什么时候做?用户如何知道指针是否仍然有效?这些事情必须记录下来,懒惰的程序员可能会跳过阅读文档。但是,如果您的API必须可以从C或其他语言调用,那么原始指针可能是唯一的选择。

共享指针在特殊情况下可能很有用,但它们确实有开销。如果您不需要共享所有权,那么使用共享指针可能会有些过头。

唯一的指针是我会使用的,除非有特定的理由使用其他东西。

尽管如此,这还是假设首先应该返回一个指针。另一个很好的选择是返回一个对象。

更具体地说:我有一个播放器类,它只存储一个id,并提供了很多方法。在这种情况下,您更愿意按价值返回?

非常肯定。

您有两个选项(没有任何令人讨厌的缺点):

C样式

有一个匹配的void destroyOneObject(MyObject* object);来清理资源。当销毁对象不像删除对象那么简单时(例如,需要在某个管理器类中注销),这是正确的选择。

智能指针

当只需要删除对象时,返回一个std::unique_ptr<MyObject>。这使用RAII来清理对象,并且更适合现代C++。

糟糕的解决方案

不要返回原始指针并对其调用delete。您不能保证delete与用于创建对象的新指针匹配。如果你一开始就应该删除它,它也不会很好地沟通。

不要使用共享指针。在几乎任何情况下,它们都是完全高估的,通常是由于对应用程序结构缺乏了解造成的。