mar*_*ino 3 c++ reference shared-ptr
我有一个对象的引用,并希望调用一个函数,该函数接受此对象的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);
...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法让它发挥作用?我怎样才能在g()中创建一个boost :: shared指针,让我的对象在结束时保持活着状态?我想我必须将它连接到已经指向对象的其他共享指针的引用计数机制......但是如何?
即使我让它成功,你认为这种做法是糟糕的设计吗?解决这类问题的最佳做法是什么?在我的代码中,我有对象和方法都可以使用共享指针和引用,我不能只使用这些或那些......
一个shared_ptr关于它做什么的功能.它说,"我希望可能声称拥有此对象的共享权".如果这不是真的,那么这是一个写得不好的功能,根本不应该采取shared_ptr任何措施.
通过不const引用对象获取值的函数意味着该函数可以修改对象,但不能声明所有权.如果你没有东西,你也不能给别人所有权.
现在,您可以执行使用空删除函数的技巧:
void EmptyDeleter(Obj *) {}
double g(Obj& object)
{
boost::shared_ptr<Obj> p(&object, EmptyDeleter);
double x = f(p);
...
}
Run Code Online (Sandbox Code Playgroud)
但是,你现在躺在来f.它没有object; 它不能拥有object.很可能object是一个堆栈对象,可能在f完成后的任何时候消失.如果f是类的成员,它可能会将其存储shared_ptr在成员变量中.在那时,它将有shared_ptr一个死对象.这正是shared_ptrs旨在防止的事情.
正确的答案是要么f不采用它的参数shared_ptr(如果它是可修改的,则使用非const引用或非const指针,const&如果它是不可修改的),或者g采用其参数shared_ptr.