std::shared_ptr 在不同的计算机上使用 MSVC 崩溃?
std::shared_ptr crash with MSVC on different computer?
编译并运行以下简单程序在我的开发机器(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;
}
删除带有共享指针的行使其工作。
知道这里可能有什么问题,或者如何调试吗?
我发现了问题,以防这对任何人有用:
在windows事件查看器中,我发现了崩溃的原因:异常是0xc000001d
或illegal 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
生成了 vpxor
和 vmovdqu
指令,这些指令不会 运行 在太旧的处理器上(例如我测试过的那个)。
解决方案是使用带有和不带有 AVX 指令的单独版本的可执行文件(或通过程序的单独路径)以支持旧处理器。
编译并运行以下简单程序在我的开发机器(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;
}
删除带有共享指针的行使其工作。
知道这里可能有什么问题,或者如何调试吗?
我发现了问题,以防这对任何人有用:
在windows事件查看器中,我发现了崩溃的原因:异常是0xc000001d
或illegal 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
生成了 vpxor
和 vmovdqu
指令,这些指令不会 运行 在太旧的处理器上(例如我测试过的那个)。
解决方案是使用带有和不带有 AVX 指令的单独版本的可执行文件(或通过程序的单独路径)以支持旧处理器。