0

私は最近、単純な 2D ゲーム エンジンを完成させました。私のプロジェクトのスプライトモジュールには、例外があります

「AI.exe の 0x00CE4A75 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0xCCCCCCCC.」

すべてが同じように初期化および割り当て解除されるため、何が原因かわかりません。そして、この例外はif( m_inputLayout ) m_inputLayout->Release()で発生するようです。他のすべては問題ありません。コードはすぐ下にあります。

CAIGESprite::~CAIGESprite(void)
{
    if( m_mvpCB ) m_mvpCB->Release();
    if( m_alphaBlendState ) m_alphaBlendState->Release();
    if( m_colorMapSampler ) m_colorMapSampler->Release();
    if( m_colorMap ) m_colorMap->Release();
    if( m_vertexBuffer ) m_vertexBuffer->Release();
    if( m_inputLayout ) m_inputLayout->Release();
    if( m_solidColorPS ) m_solidColorPS->Release();
    if( m_solidColorVS ) m_solidColorVS->Release();
    if( m_textureFile ) delete m_textureFile;
    if( m_shaderFile ) delete m_shaderFile;

    m_shaderFile = nullptr;
    m_textureFile = nullptr;
    m_solidColorVS = NULL;
    m_solidColorPS = NULL;
    m_inputLayout = NULL;
    m_vertexBuffer = NULL;
    m_colorMap = NULL;
    m_colorMapSampler = NULL;
    m_alphaBlendState = NULL;
    m_mvpCB = NULL;
}

また、それぞれの内容を確認したところ、すべて空のUnable to read memoryであるのに、なぜ m_inputLayout が異なり、例外が発生するのでしょうか? 考えられる理由は何ですか。

リクエストがあれば、さらにコードを投稿します。

4

2 に答える 2

1

「if」演算子はブール条件のみをテストすることに注意してください。「 != 0 」を指定せずに null チェックに「if」を直接使用するのが一般的ですが、ブール値へのポインターの暗黙的なキャストを行います。ポインターが 0 の場合、値は false であり、0 以外の場合、値は true です。変数が初期化されていない場合でも、メモリの場所はガベージ値を保持できますが、デバッグ モードでは、通常、0xCCCCCCCC またはその他の既知の定数を取得して、問題の原因を突き止めるのに役立ちます。したがって、私の意見では、変数は初期化されていません。コードをステップ実行すると、その値が「0xCCCCCCCC」であることがわかります。変数の命名により、それがメンバー変数であると推測しますが、

于 2013-06-29T22:05:15.390 に答える
0

「m_inputLayout」はコンストラクターで正しく null に初期化されましたか? 作成されていない無効なポインターを削除しようとしている可能性があります。

于 2013-07-29T04:20:19.577 に答える