0

イメージマネージャーであるシングルトンがあります。画像を読み込もうとすると、次のようにシングルトンを呼び出します。

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

そして、loadFromFile メソッドで、画像をマップに保存します。

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

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

これは昨日はうまくいきました

いくつかのアドバイス?

編集: m_imageMap の宣言は非常に単純です:

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

追加情報として、生成された例外はファイル output.c の 1643 行にあります。

編集さて、私はこのケースに非常に失望しています。コードを変更したので、クラスはシングルトンではなくなりました。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 の内容を削除する方法を考える必要があります。

皆さんに感謝します

4

2 に答える 2

3

std::map は、適切なコンストラクターによって提供されるもの以外は、初期化を必要としません。コンストラクターを呼び出している限り (デフォルトのコンストラクターでも問題ありません)、マップは適切に初期化されます。シングルトンは、非常に多くの恐ろしい問題を伴う本当にひどいパターンであり、コードからそのような悪魔を取り除く必要がありますが、通常、これを含むものはありません。実際の問題を解決するには、Singleton コードを含む別の質問を投稿する必要があります。

于 2011-01-16T19:58:47.310 に答える
3

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

その場合は、ゾンビでそのメンバー関数を呼び出している可能性が高く、それ以外の場合は無効なポインターです。m_imageMap を含むコード行は、その関数でメンバー変数を最初に使用したものですか? よくある景品です。

この問題をデバッグする簡単な方法は、デバッガーで確認することです。このエラーがデバッグ ビルドで発生する限り、VC++ は喜んでアクセス違反の例外をキャッチし、その瞬間に中断します。ローカル変数ウォッチ ウィンドウで「this」ポインターの値を確認します。null または0xcdcdcdcdですか?

于 2011-01-16T21:23:29.043 に答える