C++ 使用XMVECTOR时出现内存访问异常

C++ 使用XMVECTOR时出现内存访问异常,c++,windows,memory-management,C++,Windows,Memory Management,我在DirectX11中发出砰砰声,我得到了一些奇怪的错误 我在我的Pong类中声明了一个指针: XMVECTOR *ballDirection; 出于某种原因,每当我尝试访问它时: Unhandled exception at 0x002127d8 in DirectX11Pong.exe: 0xC0000005: Access violation reading location 0x00000000. 我很确定当您尝试访问nullptr指针时会发生这种情况,但是, 在对指针进行任何

我在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);
我认为唯一相关的其他信息是,我之前曾尝试将包含桨信息的单个指针转换为指针数组(针对多个玩家):

(之前)

(之后)

就在我这么做的那一刻,我在访问
ballDirection
时遇到了这个错误, 尽管在我制作这个数组之前它工作得很好,而且在创建数组和修改相应代码时,我没有更改任何代码来处理
ballDirection


在我注意到这个错误后,我重新修改了代码,但这种情况仍然发生

我怎样才能解决这个问题

  • 始终检查您的分配!至少是这样的:

    #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())
    
    二,。使用调试器!设置一些断点,检查每行中从分配位置到错误位置的指针值

  • 始终检查您的分配!至少是这样的:

    #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())
    
    二,。使用调试器!设置一些断点,检查每行中从一个分配位置到错误位置的指针值。

    Microsoft对
    XMVECTOR
    的动态分配执行以下操作:

    然而,来自堆的分配更为复杂。因此,你 无论何时使用XMVECTOR还是XMMATRIX作为 要从堆中分配的类或结构的成员。 在Windows x64上,所有堆分配都是16字节对齐的,但对于 在Windows x86中,它们只有8字节对齐

    因此,您不应该只在那里使用
    新的XMVECTOR
    ,而期望所有这些都能正常工作。

    微软在
    XMVECTOR
    的动态分配方面做到:

    然而,来自堆的分配更为复杂。因此,你 无论何时使用XMVECTOR还是XMMATRIX作为 要从堆中分配的类或结构的成员。 在Windows x64上,所有堆分配都是16字节对齐的,但对于 在Windows x86中,它们只有8字节对齐


    因此,您不应该只在那里
    新建XMVECTOR
    ,并期望所有的东西都能正常工作。

    是否完全违背了一些未经说明的信条,您必须在裸声明中将指针初始化为NULL<代码>精灵*桨=空。请养成这个习惯。如果可以,请做一个测试用例!这里没有足够的信息来了解您做错了什么。“在我注意到此错误后,我更改了代码,但仍然发生了这种情况。”您是否完全重建了项目?重建不起作用:(讽刺的是,把指针设为空,我是一个14岁的孩子,他在互联网上随机学习3个月的C++。不要讨厌!这完全违背了一些未言说的信条吗?你必须在裸声明中初始化空指针。<代码> SpReT*Palle = NULL;< /代码>请进入这个习惯。请M。如果可以,请创建一个测试用例!这里没有足够的信息来知道您做错了什么。“在我注意到此错误后,我更改了代码,但仍然发生这种情况。”您是否完全重建了项目?重建不起作用:(讽刺的是,把指针设置为空,我很抱歉,我是一个14岁的孩子,他在互联网上随机学习3个月的C++。不恨!太棒了!我把它转到XMFLAT2,并制作了我自己的函数来规范向量,现在它工作得很好!有趣的是,答案是没有“喜欢”的。是最清晰的,也是最有效的,非常感谢:D@Aaronman8不客气。建议您调试代码的答案确实更受欢迎。我的经验是,Microsoft的技巧往往是问题的原因(而且调试Microsoft的封闭源代码库并不容易).太棒了!我把它改成了XMFLOAT2,并创建了自己的函数来规范化向量,现在它工作得很好!有趣的是,没有“喜欢”的答案是最清晰的,也是最有效的,非常感谢:D@Aaronman8不客气。建议您调试代码的答案确实更受欢迎。我的经验是,Microsoft的技巧往往是问题的原因(而且调试Microsoft的封闭源代码库并不容易)。