0

Компиляция и запуск следующей простой программы отлично работает на моей машине разработчика (Visual Studio 2015, 64-разрядная версия).std :: shared_ptr авария с MSVC на другом компьютере?

Запуск же код на различные авариях машины с диалогом ошибки окна, даже если установлены x64-распространяемые (msvcp140.dll):

#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; 
} 

Удаление строки с общим указателем делает его работу ,

Любая идея, в чем проблема может быть здесь, или как отлаживать?

+0

Похоже, проблема с msvcp140.dll Скопируйте рабочую dll из другой системы в папку приложения и повторите тест. – seccpur

+0

собирайте мини-накопитель из машины для обрушения и исследуйте. Какая ошибка? какой конфиг? (Я думаю, что в 'release' эта строка не должна иметь никакого значения, как было бы полностью оптимизировано). и на всякий случай, дважды проверьте, что вы действительно пробовали * этот * код на обеих машинах –

+0

Какое сообщение об ошибке? –

ответ

0

Я нашел эту проблему, в случае, если это полезно для тех, кто:

В средстве просмотра событий Windows, я обнаружил причину аварии: Исключение было 0xc000001d или illegal instruction. Appareantly мой код был скомпилирован с использованием флага в /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 и без них для поддержки старых процессоров.