0

我在 DirectX11 中打乒乓球,但遇到了一些奇怪的错误。

我在我的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

微软确实说过动态分配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 回答