2011-01-16 19 views
0

私はイメージマネージャーであるシングルトンを持っています。std :: mapは初期化する必要がありますか?

m_imageMap[imageHashID].setHeight(ilGetInteger(IL_IMAGE_HEIGHT)); 
m_imageMap[imageHashID].setWitdh(ilGetInteger(IL_IMAGE_WIDTH)); 
m_imageMap[imageHashID].setBpp(ilGetInteger(IL_IMAGE_BPP)); 
.... 

問題は私が得ることです:LoadFromFileメソッドに、私はマップに画像を保存し、

utils::CImageBuff* img4 = utils::CImageManager::getInstance()->loadFromFile("uswg.png"); 

そして:私はイメージをロードしようとすると、私はこのようにシングルトンを呼び出しますmemアクセスエラー。 m_imageMapがNULLの場合は間違って初期化されます。例外は最初の文でスローされるためです。しかし、私が言ったように、シングルトンなのでマップは私が初期化しなければならない。私はVC++ 2008で開発しています。間違ったコンパイル/ .objファイルになる可能性がありますか?

これは昨日正常に機能していた

いくつかのアドバイスはありますか?

編集: m_imageMapの宣言は非常に簡単である:付加情報として

typedef std::map<unsigned int,utils::CImageBuff> t_imageMap; 

、生成された例外は、ファイルoutput.cの行1643にあります。

編集まあ、私はこのケースで非常にdissapointedです。コードを変更したので、クラスはもはやシングルトンではなくなりました。現在は、m_imageMapだけが静的なので、読み込まれたすべてのイメージをどこからでも見ることができます。しかし、それでも同じように失敗します。エラーはアクセス違反です。さらに、このコードですべてのメソッドコードを次のように変更した場合:

utils::CImageBuff im; 
m_imageMap[1] = im; // fails here 
return &im; 

はまだ失敗します。それはマップがnullまたは任意の方法でロックされているか、または悪い初期化されたようですが、私は知らない。私たちを手伝ってくれますか?

さらにコードが必要な場合は貼り付けますが、この3行でクラッシュすると問題が簡素化されます。

編集:最後に最後に私が

std::map<unsigned int,utils::CImageBuff*> 

std::map<unsigned int,utils::CImageBuff> 

から変更したそして今、それが動作解決しました。今私はポインタの静的なstd :: mapの内容を削除するメソッドを考える必要があります。すべて

+0

'm_imageMap'はどのように宣言されていますか? –

+3

'm_imageMap'の定義を示してください。 'std :: map'は' NULL'にすることはできません。それは意味をなさない。 –

+1

m_imageMapはどのようなタイプですか?残りのloadFromFile関数の外観はどうなっていますか? – SoapBox

答えて

3

私はm_imageMapがクラスの通常のメンバ変数であり、あなたはそのクラスのメンバ関数からこれを呼び出すと仮定しています。

この場合、ゾンビでメンバー関数を呼び出している可能性があります。そうでない場合は無効なポインタです。その関数のメンバ変数を最初に使用したm_imageMapのコード行はありますか?それはかなり一般的なプレゼントです。

この問題を簡単にデバッグするには、デバッガでデバッグする方法があります。このエラーがデバッグビルドで発生している限り、VC++は幸いにその瞬間にアクセス違反の例外をキャッチしてそこを破ります。ローカル変数ウォッチウィンドウの "this"ポインタの値を見てください。 nullまたは0xcdcdcdcdですか?

+0

私はあなたの応答を完全には支えていません。実際、m_imageMapはクラスの通常のメンバーであり、このクラスのメンバ関数からこのメンバを呼び出しています。しかし、問題は、このゾンビを捕まえる方法、そしてシングルトンであること、このゾンビをprovoqueするコードを見つける方法です。 m_imageMapはnullではありません。それらの値は単純に(デバッグモードの検査による)[0]()ですが、いつでも変更されることはありません。 AFAIK、この要素を構成する要素を挿入するだけです.... – Killrazor

+0

私が言っていることは、おそらくm_imageMap自体に何も問題はないということです。(シングルトンからCImageBuffのポインタあなたの問題はm_imageMapを所有するクラスである可能性が高いです。どのように作成して参照していますか?あなたが 'ImageMapOwnerClass * owner = null;オーナー - > AddSomethingToImageMap(); '、あなたの記述どおりにクラッシュします(あなたのサンプルコードがその関数にある場合)。 – Alan

2

のstd ::マップへ

多くのおかげでは、適切なコンストラクタで提供されるもの以外のinitialization-必要ありません。あなたがコンストラクタを呼び出す限り(デフォルトのマップもうまくいきます)、マップは適切に初期化されます。シングルトンは本当にひどいパターンで、多くの恐ろしい問題があります。コードからそのような悪魔を消すべきですが、通常はこれを含んでいません。実際の問題を手助けするために、シングルトンコードで別の質問を投稿する必要があります。

+0

+1シングルトンはひどいデザインパターンです。 –

関連する問題