我有一个类暴露它的界面添加功能:
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
。
你认为我的建议是个好主意吗?
答案 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)
以下任何一种方法都可以解决您的问题。
AddObject
附加更多评论,告诉用户删除他们添加的指针是不允许的。这几乎就够了。Object
继承自具有私有析构函数和名为destroyByOwner
的方法的基类。