weak_ptr重置会影响shared_ptr吗?


11

我不习惯使用它weak_ptr,我正面临一个令人困惑的情况。我正在将Intel XE 2019 Composer更新5程序包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

怎么了?重置shared_ptr关联时,修改/无效是正常的weak_ptr吗?我对获得的结果感到有些困惑。说实话我没想到会有这个结果...

编辑1

虽然该错误发生在64位配置中,但不是32位。在此更高版本的配置中,结果是预期的。

编辑2

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



2
我认为您的实现存在错误。 gcc产生正确的结果
NathanOliver

1
无法在Visual Studio 2019(v.16.2.5)中进行
复制-Frodyne

1
不,这绝对不正常。
畸形的

4
如果它有助于调试,-572662307 = 0xDDDDDDDD这是msvc指示释放的堆内存的方式
Eric

Answers:


2

看来,这是英特尔ICC方面的真正错误。我已经报告了。

再次感谢您帮助我指出这个问题。


1
您能否在答案中添加指向错误报告的链接?这样,具有相同问题的任何人都可以向错误报告查询其状态。
桑德·戴克

一旦案件解决,我宁愿添加评论。
dom_beau,

1
是的,请添加链接-读者可以在报告中添加自己的评论。
上半场

不知道如何。如果您找到该链接,则需要一个Intel帐户才能看到它???也许我错了???告诉我...我开了票,并且已在我的帐户中。
dom_beau,

也许您可以在论坛上进行讨论:C ++编译器论坛
dom_beau 19-10-9

1

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

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

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


它提供了1 2两个64位32位调试发布
dom_beau '19

2
该错误是在_Ref_count_base默认的cTor中指定的= default。这两个成员_Uses = 1_Weaks = 1分别设置为10。似乎默认生成的cTor是错误的。请参阅memory文件...
dom_beau,

@dom_beau很好,这是报告的价值,我们也知道,在初始化C ++是认真的疯狂
斯威夫特-周五饼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.