dom*_*eau 11 c++ smart-pointers icc c++17 visual-studio-2019
我不习惯使用它weak_ptr,我正面临一个令人困惑的情况。我正在将Intel XE 2019 Composer Update 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;
}
Run Code Online (Sandbox Code Playgroud)
我期望的输出是:
*sp = 42
*sp = 42, *wp = 42
*sp = 42
Run Code Online (Sandbox Code Playgroud)
...但这是我获得的:
*sp = 42
*sp = 42, *wp = 42
*sp = -572662307
Run Code Online (Sandbox Code Playgroud)
怎么了?重置shared_ptr关联时,修改/无效是正常的weak_ptr吗?我对获得的结果感到有些困惑。说实话我没想到会有这个结果...
虽然该错误发生在64位配置中,但不是32位。在此更高版本的配置中,结果是预期的。
该错误仅在Debug中出现。当我构建Release时,我得到了预期的结果。
它看起来像是调试库中的一个错误,带有哨兵值。通过使用我提到的行很容易检查:
int i = 1; cout << i << " " << ++i << endl;
Run Code Online (Sandbox Code Playgroud)
如果输出2 2不是1 2,则编译器不兼容,并且可能仍将这种情况视为 UB。在这种情况下,调用 时可能会错误地使用哨兵值reset()。删除通过在预分配的静态缓冲区中放置 new 创建的对象会发生类似的情况,在调试模式下,它会被某些具有哨兵值的实现覆盖。
| 归档时间: |
|
| 查看次数: |
200 次 |
| 最近记录: |