2009-10-17 5 views
0

J'ai une classe dans une DLL qui est utilisée dans beaucoup d'autres DLL et EXE. Il a quelques méthodes définies dans le fichier include (c'est-à-dire le corps de la méthode est dans le fichier .h) qui est inclus dans les autres binaires. L'un d'eux me donne des coups: int GetVersion() { return nVersion; }.Problème de méthode défini dans le fichier d'en-tête VC++

Il renvoie toujours -842150451, mais lorsque je cours dans le débogueur et que j'examine les variables de membre de la classe, nVersion est .

Des idées sur la façon de déboguer ce problème? Je suis vraiment coincé.

(Note: Cela a fonctionné très bien pour une décennie, mais maintenant nous nous dirigeons notre code de VC6.0 à VS2005, et il n'a pas été lisse ...)

+0

Où 'nVersion' est-il défini? – strager

+0

C'est une variable membre de la classe, déclarée dans le .h. Sa valeur est définie dans une méthode précédemment appelée. – user191582

Répondre

3

Cette valeur en hexadécimal ressemble 0xCDCDCDCD qui est normalement de la mémoire non initialisée dans une version de débogage. Êtes-vous sûr que nVersion est initialisé?

+0

Oui, c'est la chose étrange! Si je regarde le contenu de mon instance de classe, la variable membre nVersion est là, et est définie sur 100, comme je le pense. – user191582

+0

Dans l'instance que vous vérifiez (dans le débogueur où la valeur indique 100), s'agit-il d'une instance singleton, globale ou locale? –

+0

Une instance locale, je suppose que vous diriez. Je crée une instance de la classe en appelant "new". Dans le débogueur, j'ai l'appel, nVers = clas-> GetVersion(); et quand je passe la souris sur 'clas' je peux voir ses variables membres, y compris nVersion, qui est 100. – user191582

1

J'ai eu un problème similaire lié à l'ordre d'initialisation non défini avec des variables statiques.

0

Donc, si je vous suis, vous avez l'équivalent de suivre en cours:

clas=new MyClass(); 
// some other code executes 

clas->SetVersion(100); 
/// some other code executes... 
/// one line before, nVersion is fine. 
int n=clas->GetVersion(); ///< this is where it all goes wrong 

(j'aurais posté un commentaire mais il ne formate pas le code)

I Supposons également que vous êtes sûr que le pointeur pour CLAS n'est pas en quelque sorte corrompu pointé vers la mémoire lisible/exécutable. (Cela compliquerait beaucoup les choses)

En ce qui concerne les outils pour vous aider à déboguer ceci, essayez d'utiliser un outil de profilage de la mémoire tel que l'analyseur de mémoire Compuware DevPartner. D'autres à examiner incluent Purify, Insure ++ (que j'ai également utilisé, et est plus puissant, mais plus difficile à utiliser)

Ces outils ont tendance à vous avertir rapidement des erreurs de mémoire faciles à trouver, mais difficiles à trouver.

Questions connexes