std :: shared_ptr在不同的计算机上与MSVC崩溃?

时间:2016-10-10 13:56:45

标签: c++ visual-studio visual-c++ visual-studio-2015 redistributable

编译并运行以下简单程序在我的开发人员计算机上运行正常(Visual Studio 2015,64位)。

即使安装了x64-redistributables(msvcp140.dll),在不同的计算机上运行相同的代码也会崩溃并出现Windows错误对话框:

#include <memory>
#include <iostream>

int main(int argc, char **argv) {
  std::shared_ptr<int> test; // comment out to run on both machines

  std::cout << "Done: " << std::endl;
}

使用共享指针删除行使其有效。

知道这里的问题是什么,或者如何调试?

1 个答案:

答案 0 :(得分:0)

我发现了这个问题,以防这对任何人都有用:

在Windows事件查看器中,我发现了崩溃的原因:例外是0xc000001dillegal instruction。显然我的代码是使用/arch:AVX编译标志编译的,导致上面代码段的代码如下:

int main(int argc, char **argv) {
00007FF749A816B0  sub         rsp,48h  
00007FF749A816B4  mov         qword ptr [rsp+20h],0FFFFFFFFFFFFFFFEh  
00007FF749A816BD  vpxor       xmm0,xmm0,xmm0  
00007FF749A816C1  vmovdqu     xmmword ptr [test],xmm0  
  std::shared_ptr<int> test; // comment out to run on both machines

  std::cout << "Done: " << std::endl;
00007FF749A816C7  lea         rdx,[string "Done: " (07FF749A86C70h)]  
00007FF749A816CE  mov         rcx,qword ptr [__imp_std::cout (07FF749A8A0D8h)]  
00007FF749A816D5  call        std::operator<<<std::char_traits<char> > (07FF749A8107Dh)  
  ...

正如您所看到的,由于/arch:AVX生成了vpxorvmovdqu指令,这些指令不会在太旧的处理器上运行(就像我测试过的那样)

解决方案是使用和不使用AVX指令的可执行文件的单独版本(或通过程序的单独路径)来支持旧处理器。