API返回类型 - 强制智能指针到用户?

时间:2016-06-03 11:21:05

标签: c++ pointers

假设我有一个创建并返回对象的API边框函数:

<?> createOneObject();

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

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

2 个答案:

答案 0 :(得分:6)

取决于

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

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

除非有特殊原因要使用别的东西,否则我会使用唯一指针。

虽然,假设应该首先返回一个指针。另一个很好的选择可能是返回一个对象。

  

更具体一点:我有一个只存储id的玩家类,只提供了很多方法。在这种情况下,您更愿意按值返回?

绝对是。

答案 1 :(得分:1)

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

C风格

使用匹配的void destroyOneObject(MyObject* object);来清理资源。当销毁对象不像删除对象那样简单时,这是正确的选择(例如,需要在某个经理类中取消注册)。

智能指针

如果需要删除对象,请返回std::unique_ptr<MyObject>。这使用RAII来清理对象,并且更好地适应现代C ++。

糟糕的解决方案

不要返回原始指针并在其上调用delete。您无法保证删除与用于创建对象的新内容匹配。如果你应该首先删除它,它也不能很好地沟通。

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