【发布时间】:2019-10-04 13:20:34
【问题描述】:
我不太习惯使用weak_ptr,而且我面临着一个相当混乱的情况。我将 Intel XE 2019 Composer update 5(package 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 中构建时,我得到了预期的结果。
【问题讨论】:
-
我认为您的实现存在错误。 gcc produces the correct results
-
无法在 Visual Studio 2019 (v. 16.2.5) 中重现
-
不,这绝对不正常。
-
如果它有助于调试,
-572662307 = 0xDDDDDDDD,这是 msvc 指示释放的堆内存的方式
标签: c++ c++17 smart-pointers visual-studio-2019 icc