接口函数获取初始化shared_ptr的rvalue指针

时间:2016-08-30 19:44:36

标签: c++11 shared-ptr

我有一个类暴露它的界面添加功能:

execute('ALTER TABLE inventories ADD PRIMARY KEY (id);')

在课程内部,我在void AddObject(Object *o); 中维护对象。 因为我将从接收到的指针创建set<shared_ptr<Object>>,我认为将函数参数限制为只有rvalue指针,以确保用户不会删除我使用的指针。所以我将函数声明更改为:

shared_ptr

所以典型的用途是:

void AddObject(Object* &&o);

防止用户意外删除我持有的指针。 我不想在界面中使用AddObject(new Object()) ,因为用户不熟悉shared_ptr。 你认为我的建议是个好主意吗?

3 个答案:

答案 0 :(得分:0)

我认为这是一个坏主意。我确定有一个原因可以解释为什么获取原始指针的shared_ptr c-tor被标记为显式而不是使用r值。在我看来,最好教一下用户关于智能指针或至少教他们使用make_shared / make_unique(更安全,在{{1}的情况下) },更有效率,BTW)。

BTW,为什么make_shared而不是shared_ptr

另外,为什么unique_ptr?即使您只想确保每次只按住一次指针并且每次搜索set在代码中看起来都不够自然,我也不会看到将指针排序的理由使用vector

答案 1 :(得分:0)

首先,这种方法不会阻止用户删除指针。考虑这个例子

  auto obj = new Object();
  AddObject(std::move(obj));
  delete obj;

其次,调用new和创建shared_ptr之间的步数应该尽可能少。如果在AddObject内发生任何事情之后才能创建shared_ptr,则该对象永远不会被删除。

如果AddObject()有更多参数,则同样适用。如果构造失败,你将泄漏内存。

  void AddObject(Object* &&o, SomeOtherObject* x);

  AddObject(new Object(), xx()); // if xx() throws, memory leak will occur

理想情况下,你会&#34;包裹&#34;对象创建为shared_ptr构造:

  void AddObject(std::shared_ptr<Object> o);

  AddObject(std::make_shared<Object>());

答案 2 :(得分:0)

以下任何一种方法都可以解决您的问题。

  1. 您可以为AddObject附加更多评论,告诉用户删除他们添加的指针是不允许的。这几乎就够了。
  2. 或者,您也可以使Object继承自具有私有析构函数和名为destroyByOwner的方法的基类。