Debug Assertion Failed! Expression: _pFirstBlock == pHead

Je suis remettre en statiquement .dll, et je vois ce message d'erreur:

Debug Assertion Failed! Expression: _pFirstBlock == pHead

J'ai écrit à la fois l' .dll et le code appelant. Cette erreur ne devrait pas se produire. Je me demandais si quelqu'un d'autre a rencontré avant? L' .dll contient seulement environ 10 lignes de code, c'est juste un test .dll afin de voir comment les dll de travail en général. Il explose quand je passe un std::string dos de la .dll.

Je suis à l'aide de Visual Studio 2012 et C++.

Ce que je vais essayer la prochaine

De Debug assertion... _pFirstBlock == pHead:

Ce problème peut se produire si l'on utilise le thread unique bibliothèques dans un
multithread module.

Demain, je vais essayer de recompiler le Boost de bibliothèques statiques en mode multithread (mon .dll est réglé sur multi-thread mode statique).

Ce que je vais essayer la prochaine

Voir Utiliser des chaînes de caractères dans un objet exporté à partir d'une DLL causes d'erreur à l'exécution:

Vous avez besoin de faire une de deux choses

  1. Faire à la fois la DLL et le client qui l'utilisent à la fois le lien de la DLL version de la CRT (par ex. pas de manière statique).
  2. OU Vous devez vous assurer que vous ne passez pas la mémoire allouée dynamiquement (comme contenue dans les objets string) à travers des limites de la DLL.
    En d'autres termes, n'ont pas de DLL-fonctions exportées que la chaîne de retour
    objets.

Joe

Cela semble correspondre à ce qui se passe, il souffle jusqu'au point précis où je passe une chaîne de retour dans une .dll limite. Le problème se produit uniquement lorsque tout est lié en mode statique. Maintenant que c'est réparable.

Voir Référence passant de vecteur STL sur dll limite.

Ce que je vais essayer la prochaine

Voir Incapables de passer à std::wstring à travers DLL.

Solution

J'ai une belle solution, voir la réponse ci-dessous.

  • Et précisément ce qui est votre question?
  • Il indique que vous avez des tas de corruption. Ce qui peut provoquer une corruption de segment de mémoire? Au moins un million de choses différentes. Si vous publiez certaines de code peut-être que quelqu'un peut vous aider.
  • J'ai écrit à la fois l' .dll et le code appelant. Cette erreur ne devrait pas se produire. Je me demandais si quelqu'un d'autre a rencontré avant?
  • Mais il est clair que se passe. Réclamez-vous que vous êtes incapable d'écrire le code qui endommage le tas?
  • L' .dll contient seulement environ 10 lignes de code, c'est juste un test .dll pour voir comment il fonctionne.
  • Même si vous pensez qu'il ne faut pas se produire, il est clairement. Donc, il y a 99,9% de chance il y a quelque chose de mal dans votre code...
  • Puis afficher le code, et le code d'appel, si possible, tout
  • Si vous voulez la recherche de choses vous-même, essayez de regarder à la ligne 1424 de dbgheap.c. Il peut vous donner des indices.
  • à la simple évocation de l'erreur dans un moteur de recherche. Certains intéressant de frappe, par exemple, casablanca.codeplex.com/discussions/442262, "Que la trace de la pile est trop familier pour moi -- la mise en page de chaînes standard varient entre d'exécution des binaires pour les différentes configurations. Si j'étais un homme de pari, je serais prêt à parier que vous avez un mélange de release et debug binaires dans l'exécution de votre dossier." Aussi stackoverflow.com/questions/15524591/.... Essentiellement, il semble que vous pourriez avoir une disparité entre la façon dont votre exe et dll sont construits.
  • Je pense que vous avez probablement raison. Je vais vérifier que les paramètres de mon .projet exe et .projet de dll sont pas différents.
  • Cela s'est également produit lors du déplacement de Visual Studio 2015 et depuis Qt ne fournit pas les binaires Qt doit être construit à nouveau avec les bonnes options (Visual Studio compilateur)...

InformationsquelleAutor Contango | 2013-09-18