【问题标题】:Passing a row `(*sp)[i]` of a matrix `shared_ptr<vector<vector<T>> sp` to a function which accepts a `shared_ptr<vector<T>>`将矩阵 `shared_ptr<vector<vector<T>> sp` 的行 `(*sp)[i]` 传递给接受 `shared_ptr<vector<T>>` 的函数
【发布时间】:2015-08-08 00:04:45
【问题描述】:

我有一个std::shared_ptr&lt;std::vector&lt;std::vector&lt;double&gt;&gt; sp,需要将(*sp)[i](对于某些i)传递给一个接受std::shared_ptr&lt;std::vector&lt;double&gt;&gt; 的函数foo。我该怎么做?

一个选项是foo(std::make_shared&lt;std::vector&lt;double&gt;&gt;((*sp)[i]),但这会创建矢量(*sp)[i] 的副本。由于(*sp)[i] 可能很大,我绝对不希望发生这种情况。

那么,有没有什么选项可以在不复制的情况下将(*sp)[i] 传递给foo

编辑:也许我们可以这样做:

foo(std::shared_ptr<std::vector<double>>(&(*sp)[i], [](std::vector<double>* p) { }));

【问题讨论】:

  • 恐怕不可能。为什么该函数首先采用shared_ptr
  • std::shared_ptr 有一个别名构造函数。参见例如stackoverflow.com/q/19102034codesynthesis.com/~boris/blog/2012/04/25/…
  • @Quentin 也许我们可以提供一个自定义的 delete 函数,它是无操作的。请注意我的编辑。
  • @0xbadf00d 我被巧妙地反驳了。谢谢你的问题,我学到了一些很酷的东西:)
  • 如果你用自定义的无操作删除器创建一个新的shared_ptr,你必须分配一个新的控制块。最好使用别名构造函数,它重用现有的控制块。

标签: c++ c++11 smart-pointers


【解决方案1】:

使用别名构造函数。

foo(std::shared_ptr<std::vector<double>>(sp, &(*sp)[i]));

【讨论】:

  • 这正是我想要做的。谢谢!但是,我在编辑中提出的选项也应该“至少有效”,对吧?
  • 在使用子行时不会使父矩阵保持活动状态。而且,如果您不希望函数影响其参数的生命周期,则首先不应传递 shared_ptr
  • @0xbadf00d 这取决于foo 想用shared_ptr 做什么。
  • @Useless 只是为了澄清(为了他人的利益),您是在谈论空删除方法,对吗?
  • 完全正确:OP 编辑​​中的空删除器方法不管理父生命周期。
【解决方案2】:

听起来你最好的选择是要么

A) 更改 foo 以接受对 shared_ptr 的引用,这将消除按值传递。

或者

B) 使用 std::move 将 shared_ptr 移动到 foo 中,然后确保在调用后不引用 sp。

就像 Quentin 说的那样,您当前的设置是不可能的。

【讨论】:

  • 您如何看待我在编辑中提出的选项?
猜你喜欢
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2018-02-02
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
相关资源
最近更新 更多