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

Posted

技术标签:

【中文标题】std::shared_ptr 在不同计算机上与 MSVC 崩溃?【英文标题】:std::shared_ptr crash with MSVC on different computer? 【发布时间】:2016-10-10 13:56:44 【问题描述】:

在我的开发人员机器(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;

删除带有共享指针的行使其工作。

知道这里可能存在什么问题,或者如何调试?

【问题讨论】:

msvcp140.dll 似乎有问题 从您的应用程序文件夹中的其他系统复制工作 dll 并再次测试。 从崩溃的机器中收集小型转储并进行调查。有什么错误?什么配置? (我认为在release 中,这条线不应该有任何区别,因为它会被完全优化出来)。为了以防万一,请仔细检查您是否真的在两台机器上都尝试过 this 代码 什么错误信息? 使用 MSVC 远程调试器附加到不同机器上崩溃的应用程序 @JanRuegg: 不是全部,可能只是 msvcp140.dll 和 msvcp140p.dll,复制到 app 文件夹(不在系统文件夹中)只是为了测试 dll。 【参考方案1】:

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

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

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 指令的单独版本的可执行文件(或通过程序的单独路径)来支持旧处理器。

【讨论】:

以上是关于std::shared_ptr 在不同计算机上与 MSVC 崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

使用相同的函数但重载不同的 std::tr1::shared_ptr<T> 和 std::shared_ptr<T>

智能指针std::shared_ptr总结与使用

分配 std::shared_ptr

为啥我不能在 C++0x 中对 std::shared_ptr 的向量执行 std::copy?

为啥不推荐使用 std::shared_ptr::unique() ?

std::shared_ptr 和继承