【问题标题】:Shared_ptr indirection: Difference between (*a).b and a->b?Shared_ptr 间接:(*a).b 和 a->b 之间的区别?
【发布时间】:2017-12-24 09:54:04
【问题描述】:

据我所知,foo->bar()(*foo).bar() 相同,除了箭头以一种奇怪的方式超载时,通常不应该这样做。 This answer 似乎同意。

然而这似乎不适用于 boost::shared_ptrs。以上是我的两行代码,在某些情况下会产生不同的结果:

(*new_link).getRefNode()  // returns some value
new_link->getRefNode()    // returns something different...

我在这里错过/不理解什么?

编辑:根据要求,cout 代码和打印的内容。我确保 getRefNode() 不会以任何方式修改实例 - 如果我更改调用的顺序,值会随着调用而更改,因此它与 getRefNode() 内部所做的任何事情无关。

    std::cout << "BLink1: " << (*previous_link).getId().toStdString()
              << ", ref: " << (*previous_link).getRefNode()
              << ", nref: " << (*previous_link).getNrefNode()
              << std::endl << "Link2: " << (*new_link).getId().toStdString()
              << ", ref: " << (*new_link).getRefNode()
              << ", nref: " << (*new_link).getNrefNode() << std::endl;
    std::cout << "New link: " << new_link->getId().toStdString()
              << ", ref: " << new_link->getRefNode()
              << ", nref: " << new_link->getNrefNode() << std::endl;

BLink1: 1076889319, ref: (48.68674, 8.99122), nref: (48.68682, 8.99368)

Link2: 1076570435, ref: (48.68674, 8.99122), nref: (48.68682, 8.99368)

新链接:1076570435,参考:(48.68669,8.98889),nref:(48.68674,8.99122)

(我的亮点)

【问题讨论】:

  • 告诉我:如果你颠倒调用顺序(即先调用-&gt;),第三行中的值会移到第二行吗?
  • 好吧,boost::shared_ptr&lt;T&gt; 在应用operator-&gt; 时返回一个T*。在我看来,这种扰动就像是你班上某个地方的 UB 指标。
  • operator* 返回一个引用,operator-&gt; 返回一个应该指向同一事物的指针。如果您怀疑它实际上指向其他东西,请将其与operator* 的结果地址一起打印并验证。如果它们是相同的,那么operator* 和 ``operator->` 工作正常并且错误在别处。
  • What operator-> 返回 is 一个地址。你打印cout &lt;&lt; smartptr.operator-&gt;();.

标签: c++ pointers boost shared-ptr


【解决方案1】:

事实证明,问题不在于 (*a) 和 a-> 之间的区别,而在于将它们链接到同一个 cout 中。执行cout &lt;&lt; a-&gt;func() &lt;&lt; b-&gt;func(); 会产生与cout &lt;&lt; a-&gt;func(); cout &lt;&lt;b-&gt;func(); 不同的结果。

我将为此提出一个新问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2012-06-26
    • 2019-12-18
    • 2016-01-13
    • 2013-08-08
    • 2014-12-05
    • 1970-01-01
    相关资源
    最近更新 更多