C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 我有一个引用,想要调用一个带有boost :: 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);
  ...
}@H_450_8@ 
 

有没有办法让它发挥作用?我怎样才能在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);
  ...
}@H_450_8@ 
 

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

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

大佬总结

以上是大佬教程为你收集整理的c – 我有一个引用,想要调用一个带有boost :: shared_ptr的函数全部内容,希望文章能够帮你解决c – 我有一个引用,想要调用一个带有boost :: shared_ptr的函数所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。