Je travaille sur une application Win32 C ++ dans Visual Studio.
Dans l'un des fichiers source, j'ai un objet global comme ci-dessous. P>
struct Source { }; class TestClass { list<Source> sourceList; public: TestClass() {} ~TestClass() {} };
6 Réponses :
Il s'écrase dans le destructeur, une exception est lancée à partir du destructeur qui appelait terminer et écraser votre application. Exceptions non capturées P>
Il y a deux situations dans lesquelles un destructeur est appelé. Le premier est quand un objet est détruit dans des conditions "normales", par exemple, lorsqu'elle est hors de portée ou est explicitement supprimée. La seconde est quand un objet est détruit par le mécanisme de manipulation d'exception lors de la partie déroulante de la pile de propagation d'exception. Vous devez écrire vos destructeurs sous l'hypothèse conservatrice qu'une exception est active, car si le contrôle laisse un destructeur en raison d'une exception, tandis qu'une autre exception est active, C ++ appelle la fonction de terminaison P> blockQuote>
L'objet global est construit avant que le principal () soit appelé. Je pense donc que sa destruction se passe après les sorties principales (). Ce temps, la liste
La question est la suivante: pourquoi la tête de Sourcelist est-elle invalide? Si votre EXE & DLL est correctement construit avec des roulements compatibles, ce code devrait fonctionner correctement. Le runtime nettoyera les objets globaux avant que le tas ne soit libéré.
Crash est résolu en utilisant la même bibliothèque d'exécution dans EXE et DLL. Merci à tous de m'aider.
Les objets globaux sont initialisés et détruits par le temps d'exécution C. Ils sont initialisés avant L'erreur est probablement causée par quelque chose qui est accessible à partir de votre L'ordre d'initialisation et de destruction des variables globales n'est pas défini et est fréquemment une source d'erreurs sur la résiliation des applications. S'il y a d'autres globaux qui pourraient nettoyer ou modifier des ressources référencées par testclass, cela pourrait être le coupable. P> principal code> est appelé et détruit après son retour. P>
destructeur code> destructeur (ou indirectement à partir d'une source
source code> destructeur). Le code Destructor accède à la mémoire non valide (ou à la mémoire déjà libérée). P>
Je n'ai ajouté aucun nœud au Sourcelist (liste
Quel (s) CRT (s) construisez-vous l'EXE et la DLL?
Assurez-vous de construire Bot l'EXE et la DLL avec le même runtime, de préférence avec le temps d'exécution dynamique. p>
Crash est résolu en utilisant la même bibliothèque d'exécution dans EXE et DLL. Merci à tous de m'aider.
sont la DLL et l'exe construit à l'aide du même alignement (Pack Pragma)? P>
Votre problème est que les paramètres de compilation / liaison différents entre les .exe et .dll provoquent efficacement le fichier .dll et .exe d'utiliser différentes implémentations de la bibliothèque standard: P>
Pour résoudre ce problème, allez à AS de Visual Studio 2010, certaines de ces types d'erreurs seront détectées à l'heure de liaison utilisant # pragma détecte_mismatch . p>
* pour tous les drapeaux de préprocesseur ayant des effets de la mise en œuvre de la bibliothèque standard SUB> P> Projet> Propriétés> Propriétés de configuration> C / C ++> Génération de code Code> et modifier l'option de la bibliothèque d'exécution en
DLL de débogage multi-threadé (/ MDD) code>. Vous devez le faire pour le projet .exe et le projet .dll. P>
+1 code> de moi pour cette réponse complète. @ bjskishore123: Veuillez lire le FAQ . Vous êtes encouragé à accepter la réponse que vous vous sentez la plus aidée à résoudre votre problème.
Essayez de rendre votre constructeur et destructeur non intégré, cela peut aider. Si CORTOR et DTOR ne sont pas en ligne, les deux seront générés au nom de la DLL, de sorte que la construction et la destruction de la liste <> seront exécutées avec la même bibliothèque d'exécution. Généralement, essayez d'éviter de passer des objcts opaques stl sur les limites de la DLL. Il est préférable de les incapable comme des membres du privatterie dans vos propres classes et de fournir des méthodes non inlinées pour manipuler un tel membre p>
Utilisez quatre espaces pour indenter le code et aucun pour le texte normal.
Avez-vous construit l'EXE et la DLL avec le même runtime C ++?
Oui j'ai construit les deux avec Visual Studio. Seul le type de configuration est différent. L'un est EXE et d'autres sont la configuration DLL dans les paramètres du projet.
Comment reliez-vous votre DLL à EXE? par liaison statique conventionnelle (utilisation de .lib)
Crash est résolu en utilisant la même bibliothèque d'exécution dans EXE et DLL. Merci à tous de m'aider.