0

La compilation et l'exécution du programme simple suivant fonctionnent correctement sur ma machine de développement (Visual Studio 2015, 64 bits).std :: shared_ptr crash avec MSVC sur un autre ordinateur?

Exécution du même code sur une machine tombe en panne différentes avec les fenêtres de dialogue d'erreur, même si les x 64 redistribuables sont installés (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; 
} 

Retrait de la ligne avec le pointeur partagé rend le travail .

Une idée de ce que le problème pourrait être ici, ou comment déboguer?

+0

Cela ressemble à un problème avec msvcp140.dll Copiez la DLL de travail de l'autre système dans votre dossier d'application et testez à nouveau. – seccpur

+0

collecter minidump de la machine s'écraser et d'enquêter. Quelle est l'erreur? quelle config? (Je pense que dans 'release' cette ligne ne devrait pas faire de différence car elle serait complètement optimisée). et juste au cas où, vérifiez que vous avez vraiment essayé * ce * code sur les deux machines –

+0

Quel message d'erreur? –

Répondre

0

Je trouve le problème, dans le cas où cela est utile pour tout le monde:

Dans l'Observateur d'événements Windows, j'ai découvert la raison de l'accident: L'exception était 0xc000001d ou illegal instruction. Appareantly mon code a été compilé en utilisant le drapeau de compilation /arch:AVX, entraînant le code suivant pour l'extrait ci-dessus:

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) 
    ... 

Comme vous pouvez le voir, à cause de la /arch:AVX les instructions vpxor et vmovdqu ont été produits, ce qui ne fonctionne pas sur les processeurs qui sont trop vieux (comme celui avec lequel j'ai testé).

La solution consiste à avoir des versions séparées de l'exécutable (ou des chemins distincts à travers le programme) avec et sans instructions AVX pour prendre en charge les processeurs plus anciens.