2009-07-28 6 views
0

C++を使用してwin32 dllを作成しようとしました。それは世界的に宣言された地図を持っています。しかし、私はDLLを使用してマップにアクセスしようとすると、そのランタイムエラーを与える:WindowsError:例外:アクセス違反は、0x00000008を読む。どのようにそれを解決するには?dllでマップを使用しているときにアクセス違反エラーが発生しました

宣言:static map<int,urllib> url_container;

urllibは、クラスです。

エラーのoccurance:url_container[ucid] = urllib();

エラーは、上記の点で起こります。

答えて

0

このコード

url_container[ucid] = urllib() 

は、他のグローバルオブジェクトの静的初期化子に呼び出されますでしょうか?その場合、url_containerが他のグローバルオブジェクトの前に構築されているという保証はありません。

は、オブジェクトが作成されたときに制御するためのアクセサ関数を使用するかはさておき、私はあなたがグローバルオブジェクトを回避しようと示唆しているようboost singleton

アクセサ例

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

のようにシングルトンのライブラリを使用しています。あなたの人生の残りの部分をこのような問題をデバッグするのに使うことができました。結局、1つのグローバルオブジェクトの構築は別のものに依存し、構築の順序は定義されていないため、1つのプラットフォーム/コンパイラで動作し、別のプラットフォーム/コンパイラでは失敗する可能性があります。

1

私はurllibが関数ではなく型かクラスであると仮定しますか?

コードに問題があるとは思われません。デバッガでは、例外が発生したときにコールスタックに何が表示されますか?アクセス違反が発生している場所を正確に確認すると便利です。

+0

urllibはクラスです。例外は、オブジェクトが作成されたときに発生します。 – Vicky

0

それはまだマップに存在するdoesntの場合は何を持っていることは

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

私もこの方法を試しました。それでも同じエラーが発生します – Vicky

+0

これを試しましたか?urllib * test = new urllib();それが機能するかどうかを確認するだけですか?マップ内の参照を使用する場合は、最後に削除することを忘れないでください – SwDevMan81

0

問題ないはずですが、あなたは、私がアクセス違反を解決する唯一の合理的な方法は、デバッガを使用することであると思い、それを挿入しようとする場合があります。

関連する問題