使用XMVECTOR时的内存访问异常

时间:2012-10-28 00:26:19

标签: c++ windows memory-management

我正在使用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);

我认为唯一相关的其他信息是我之前尝试将一个包含paddle信息的指针转换为一个指针数组(适用于多个玩家):

(前)

Sprite *paddle;

(后)

Sprite *paddle[2];

我这样做的那一刻,我在访问ballDirection时遇到此错误, 尽管在我创建这个数组之前它完美地运行了,但在创建数组和修改相应的代码时,我没有更改代码来处理ballDirection

在我注意到这个错误后,我改回了代码,这仍然发生了。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

Microsoft say关于动态分配XMVECTOR

  

然而,堆中的分配更复杂。就这样,你   每当你使用XMVECTOR或XMMATRIX时都需要小心   要从堆中分配的类或结构的成员。   在Windows x64上,所有堆分配都是16字节对齐,但是   Windows x86,它们只有8字节对齐。

所以你不应该只是new XMVECTOR并期望一切正常。

答案 1 :(得分: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 
    
  2. 用法:

    XBOOL(ballDirection = new XMVECTOR())
    

    2。使用调试器!设置一些断点,检查从每个行的分配位置到错误位置的指针值。