加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我有一个引用,想要调用一个带有boost :: shared_ptr的函数

发布时间:2020-12-16 10:30:45 所属栏目:百科 来源:网络整理
导读:我有一个对象的引用,并希望调用一个函数,该函数接受此对象的boost :: shared_ptr.如果我从堆栈中取消boost :: shared_ptr而不是取消对象,那么我构建一个boost :: shared_ptr来进行调用!这正是我运行此代码时发生的情况: double f(boost::shared_ptrObj obj
我有一个对象的引用,并希望调用一个函数,该函数接受此对象的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的函数正在讲述它的作用.它说,“我希望可能声称拥有此对象的共享权”.如果不是这样,那么这是一个写得不好的函数,根本不应该使用shared_ptr.

通过对对象的非const引用获取值的函数意味着该函数可以修改对象,但不能声明所有权.如果你没有东西,你也不能给别人所有权.

现在,您可以执行使用空删除函数的技巧:

void EmptyDeleter(Obj *) {}

double g(Obj& object)
{
  boost::shared_ptr<Obj> p(&object,EmptyDeleter);
  double x = f(p);
  ...
}

但是,你现在骗到f.它没有自己的对象;它不能拥有自己的对象.对象很可能是一个堆栈对象,在f完成后的任何时候都可能会消失.如果f是类的成员,它可能将shared_ptr存储在成员变量中.此时,它将拥有一个死对象的shared_ptr.这正是shared_ptrs旨在防止的那种事情.

正确的答案是f要么不通过shared_ptr获取它的参数(如果它是可修改的,则使用非const引用或非const指针,如果不可修改则使用const&),或者使用shared_ptr获取其参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读