2009-07-28 5 views
0

J'ai essayé de créer un win32 dll en utilisant C++. Il a une carte déclarée globalement. Mais quand j'essaie d'accéder à la carte en utilisant la DLL, il donne une erreur d'exécution que: WindowsError: exception: violation d'accès lecture 0x00000008. Comment le résoudre?erreur de violation d'accès lors de l'utilisation de la carte dans la DLL

Déclaration: static map<int,urllib> url_container;

qu'urllib est une classe.

Erreur occurrence: url_container[ucid] = urllib();

L'erreur se produit au niveau du point ci-dessus.

Répondre

0

Est-ce que ce code

url_container[ucid] = urllib() 

s'appelle dans un statique pour un initialiseur autre objet global? Si c'est le cas, il n'y a aucune garantie que url_container a été consumé avant l'autre objet global.

Utilisez une fonction accesseur pour contrôler quand l'objet est créé, ou utiliser une bibliothèque singleton comme boost singleton

accesseur exemple

map<int,urllib> & get_url_container() 
{ 
    static map<int,urllib> url_container; 
    return url_container 
} 

En aparté, je vous suggère d'essayer d'éviter les objets globaux. Comme vous pourriez passer le reste de votre vie à résoudre des problèmes comme celui-ci. Finalement, la construction d'un objet global dépendra d'un autre, etc. et l'ordre de construction n'est pas défini, donc il pourrait fonctionner sur une plate-forme/compilateur et échouer sur un autre.

1

Je suppose que urllib est un type ou une classe et non une fonction?

Il ne semble pas y avoir de problème avec votre code. Dans le débogueur, que voyez-vous sur la pile d'appels lorsque l'exception se produit? Il serait utile de voir exactement où cela se passe dans la violation d'accès.

+0

urllib est une classe. Et l'exception se produit lorsque l'objet est créé. – Vicky

0

Vous voudrez peut-être essayer de l'insérer si elle ne marche pas exister sur la carte encore, bien que ce que vous avez devrait être bien

url_container.insert (pair<int,urllib>(ucid,urllib())); 
+0

J'ai essayé de cette façon aussi. encore il donne la même erreur – Vicky

+0

Avez-vous essayé ceci: urllib * test = new urllib(); juste pour voir si cela fonctionne? Si vous décidez d'utiliser la référence sur la carte, n'oubliez pas de la supprimer à la fin – SwDevMan81

0

Je suppose que la seule façon raisonnable de résoudre les violations d'accès est d'utiliser un débogueur .

Questions connexes