【问题标题】:Memory access exception when using XMVECTOR使用 XMVECTOR 时的内存访问异常
【发布时间】:2012-10-28 00:26:19
【问题描述】:

我在 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 相关的代码。

在我注意到收到此错误后,我将代码改回来,但仍然发生。

我该如何解决这个问题?

【问题讨论】:

  • 是否完全违背了一些不言而喻的信条,您必须在裸声明中将指针初始化为 NULL? Sprite *paddle = NULL;。请养成这个习惯。
  • 如果可以的话请做一个测试用例!这里不足以知道你做错了什么。
  • "在我注意到收到此错误后,我将代码改回,但仍然发生这种情况。"您是否完全重建了您的项目?
  • rebuild 没有用 :(,还有关于将指针设置为 NULL 的讽刺言论,对不起,我是一个 14 岁的孩子,在互联网上随机学习 c++ 3 个月. 不要讨厌!

标签: c++ windows memory-management


【解决方案1】:

微软对say 动态分配XMVECTOR 做了以下说明:

但是,堆中的分配更为复杂。因此,你 每当您使用 XMVECTOR 或 XMMATRIX 作为 要从堆中分配的类或结构的成员。 在 Windows x64 上,所有堆分配都是 16 字节对齐的,但对于 Windows x86,它们只有 8 字节对齐。

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

【讨论】:

  • 太棒了!我将它更改为 XMFLOAT2 并制作了我自己的函数来规范化向量,它现在可以正常工作了!有趣的是,没有“喜欢”的答案是最明确的,也是最有效的,非常感谢:D
  • @Aaronman8 欢迎您。建议您调试代码的答案确实更受欢迎。我的经验是,微软的诡计往往是问题的根源(而且调试微软的闭源库并不容易)。
【解决方案2】:
  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。使用调试器!设置一些断点,在每一行检查从分配位置到错误位置的指针值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多