【问题标题】:how to pass in a std::shared_ptr but do "pass by reference" job?如何传入 std::shared_ptr 但做“通过引用”的工作?
【发布时间】:2017-10-25 22:19:16
【问题描述】:

我有一个主函数,它接受一个类对象的引用并尝试通过foo()bar() 更新它,但是,bar() 只允许传递到 shared_ptr 类型。假设我不允许修改 bar() 的签名,我如何保证它的行为符合预期。

void foo(MyStruct& s) {
  modifyS(s);
}

void bar(std::shared_ptr<MyStruct> s) {
  modifySAgain(s);
}

mainFunction(MyStruct& s) {
  foo(s);
  // bar(?) how should I do here such that s would be modified by bar()
  // bar(std::make_shared<Mystruct>(std::move(s)) ?
}

【问题讨论】:

  • 如果允许您更改bar 的签名,那么为什么不把void bar(MyStruct&amp; s) 改成foo 一样呢?
  • 您期望什么行为?您应该能够在这两种情况下修改对象。
  • bar 实际上需要std::shared_ptr 才能正常工作,或者它只需要MyStruct&amp; 才能正常工作。如果是后者,bar 写错了,应该修复。
  • 如果您的问题有低级技术解决方案,它可能涉及enabled_shared_from_this。也就是说,我认为设计是这里的问题。如果 bar 需要所有权,并且 mainFunction 调用 bar,那么传递性地 mainFunction 也需要所有权。但无论如何,免费函数应该很少需要拥有所有权。

标签: c++ c++11 pass-by-reference smart-pointers


【解决方案1】:

您可以使用空别名共享指针:

bar(std::shared_ptr<MyStruct>(std::shared_ptr<MyStruct>(), &s));

在此调用中创建的临时共享指针与空共享指针共享所有权,因此它在销毁时不执行任何操作。

这可能有点小题大做。

【讨论】:

  • 这可能很老套,但它很聪明,我什至不知道这是可能的。好的。 :-)
  • 我希望能简单介绍一下这种“黑客”的工作原理。
  • @CaptainGiraffe:参见构造函数注释 8 here。基本上,外部构造函数对第一个参数进行引用计数,但所有其他行为都基于第二个参数。所以它管理一个空指针(第一个参数),同时暴露第二个参数,就好像它正在管理它一样。但是,如果被调用的函数保留自己的副本是不安全的,因为现在它认为它可以在不正确的情况下延长值的生命周期(s 的生命周期根本与共享指针无关)。跨度>
  • @CaptainGiraffe:不,你不能保留指针,这就是重点。所以不用感谢。
  • 我们不能都分享和相处吗!
猜你喜欢
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
相关资源
最近更新 更多