【问题标题】:weak_ptr reset affects shared_ptr?weak_ptr 重置会影响 shared_ptr?
【发布时间】:2019-10-04 13:20:34
【问题描述】:

我不太习惯使用weak_ptr,而且我面临着一个相当混乱的情况。我将 Intel XE 2019 Composer update 5package 2019.5.281)与 Visual Studio 2019 版本结合使用。 16.2.5。我用 64 位编译。我使用标准的 C++ 17

这是我的秒杀解决方案的代码:

#include <memory>
#include <iostream>

using namespace std;

int main( int argc, char* argv[] )
{
    shared_ptr<int> sp = make_shared<int>( 42 );
    cout << "*sp = " << *sp << endl;

    weak_ptr<int> wp = sp;
    cout << "*sp = " << *sp << ", *wp = " << *wp.lock() << endl;

    wp.reset();
    cout << "*sp = " << *sp << endl;

    return 0;
}

我期望的输出是:

*sp = 42
*sp = 42, *wp = 42
*sp = 42

...但这是我得到的:

*sp = 42
*sp = 42, *wp = 42
*sp = -572662307

发生了什么事?当关联的weak_ptr 被重置时,shared_ptr 被修改/失效是否正常?我对我得到的结果有点困惑。说实话我没想到会有这样的结果……

编辑 1

虽然该错误出现在 64 位 配置中,但不会出现在 32 位 中。在后面的配置中,结果是预期的。

编辑 2

该错误仅发生在 Debug 中。当我在 Release 中构建时,我得到了预期的结果。

【问题讨论】:

标签: c++ c++17 smart-pointers visual-studio-2019 icc


【解决方案1】:

这似乎是英特尔 ICC 方面的一个真正的错误;我已经举报了。

再次感谢您帮助我查明这个问题。

【讨论】:

  • 您能否在答案中添加指向错误报告的链接?这样,任何有相同问题的人都可以参考错误报告了解其状态。
  • 一旦案件得到解决,我宁愿添加评论。
  • 是的,请添加链接 - 这将允许读者在报告中添加自己的评论。
  • 不知道怎么做。如果您到达该链接,您需要一个英特尔帐户才能看到它???也许我错了???告诉我...我开了一张票,它在我的帐户中。
  • 也许你可以到达我在论坛中的讨论:C++ compiler forum
【解决方案2】:

它看起来像调试库中的一个错误,带有标记值。使用我提到的行很容易检查:

int i = 1; cout << i << " " << ++i << endl;

如果输出是2 2 而不是1 2,则编译器不兼容并且可能仍将这种情况视为UB。在这种情况下,通过调用reset(),可能会错误地使用哨兵值。删除通过在预分配的静态缓冲区中放置 new 所创建的对象也会发生类似的情况,在调试模式下,它会被一些具有标记值的实现覆盖。

【讨论】:

  • 它在 64-bit32-bitDebugRelease 中都提供1 2 .
  • 该错误在_Ref_count_base 默认cTor 中指定= default。两个成员_Uses = 1_Weaks = 1 分别设置为10。似乎默认生成的 cTor 有问题。查看memory 文件...
  • @dom_beau 很好,值得报告,我们也知道C++中的初始化是Seriously Bonkers
猜你喜欢
  • 2018-05-23
  • 2017-11-11
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多