0

DirectX11 で pong を作成していますが、奇妙なエラーが発生します。

Pongクラス内で宣言されたポインターがあります。

XMVECTOR *ballDirection;

そして、何らかの理由で、アクセスしようとするたびに:

Unhandled exception at 0x002127d8 in DirectX11Pong.exe:
  0xC0000005: Access violation reading location 0x00000000.

ポインターにアクセスしようとするとこれが起こると確信していnullptrますが、ポインターへの「アクセス」が発生する前に、初期化します。

ballDirection = new XMVECTOR();

たとえば、現在このエラーが発生しているコード行は次のとおりです。

*ballDirection = XMVectorSetX(*ballDirection, 1);

関連すると思われる他の唯一の情報は、以前にパドル情報を保持する単一のポインターをポインターの配列に変換しようとしたことです (複数のプレーヤーの場合)。

(前)

Sprite *paddle;

(後)

Sprite *paddle[2];

ballDirectionこれを行った瞬間、この配列を作成する前は完全に機能していたにもかかわらず、このエラー アクセスが発生ballDirectionしました。

このエラーが発生したことに気付いた後、コードを元に戻しましたが、これはまだ発生しました。

どうすればこれを修正できますか?

4

2 に答える 2

4

Microsoft は、その動的割り当てについて次のように述べています。XMVECTOR

ただし、ヒープからの割り当てはより複雑です。そのため、ヒープから割り当てられるクラスまたは構造体のメンバーとして XMVECTOR または XMMATRIX を使用する場合は常に注意が必要です。Windows x64 では、すべてのヒープ割り当てが 16 バイトにアラインされていますが、Windows x86 では、8 バイトにアラインされているだけです。

new XMVECTORしたがって、すべてが機能することを期待してはいけません。

于 2012-10-28T00:41:28.957 に答える
1
  1. 割り当てを常に確認してください!少なくともそのような初心者のマクロ:

    #if defined(DEBUG) || defined(_DEBUG)
    #ifndef XBOOL
        #define XBOOL(x)                                                                \
        {                                                                               \
            if(!(x))                                                                    \
            {                                                                           \
                MessageBox(0, L"Error running: "L#x, L"Error", MB_OK | MB_ICONSTOP);    \
                return false;                                                           \
            }                                                                           \
        }
    #endif
    #else
        #ifndef XBOOL
            #define XBOOL(x) (x);
        #endif
    #endif 
    

使用法:

XBOOL(ballDirection = new XMVECTOR())

2. デバッガを使おう!いくつかのブレークポイントを設定し、すべての行で割り当て場所からエラーの場所までのポインター値を確認します。

于 2012-10-28T00:35:46.793 に答える