【发布时间】:2012-01-25 15:16:23
【问题描述】:
我有一个对象的引用,并想调用一个函数来获取该对象的 boost::shared_ptr。如果我构建一个 boost::shared_ptr 以在我的 boost::shared_ptr 从堆栈中取消时进行调用,那么该对象也会被取消!这正是我运行此代码时发生的情况:
double f(boost::shared_ptr<Obj>& object)
{
...
}
double g(Obj& object)
{
boost::shared_ptr<Obj> p(&object);
double x = f(p);
...
}
有没有办法让它工作?如何在 g() 中创建一个 boost::shared 指针,让我的对象在最后保持活动状态?我想我必须将它连接到已经指向对象的其他共享指针的引用计数机制......但是如何?
即使我让它发挥作用,你认为这种做法是糟糕的设计吗?解决此类问题的最佳做法是什么?在我的代码中,我有对象和方法可以同时使用共享指针和引用,我不能只使用这些或那些......
【问题讨论】:
-
为什么函数需要一个shared_ptr?
-
函数 f() 是一个对象的方法,它包含 Obj 对象的属性的持久映射。这些属性存储在将共享指针链接到属性的映射中。需要共享指针来查找映射中的对象。我会说函数 f() 必须使用共享指针,因为它参与 Obj 对象的所有权。
-
@martino 为什么地图使用
shared_ptr<Obj>,而不仅仅是Obj(在这种情况下,g会使用Obj const&,而不是shared_ptr<Obj>)。跨度> -
您是否考虑过制作对象的副本?即
f(boost::shared_ptr<Obj>(new Obj(object))——或者你需要它来引用同一个对象吗? -
@James 你所说的键是 Obj 的地图是什么意思?键应该是指向 Obj 的原始指针吗?
标签: c++ reference shared-ptr