我正在使用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
。
在我注意到这个错误后,我改回了代码,这仍然发生了。
我该如何解决这个问题?
答案 0 :(得分:4)
Microsoft say关于动态分配XMVECTOR
:
然而,堆中的分配更复杂。就这样,你 每当你使用XMVECTOR或XMMATRIX时都需要小心 要从堆中分配的类或结构的成员。 在Windows x64上,所有堆分配都是16字节对齐,但是 Windows x86,它们只有8字节对齐。
所以你不应该只是new XMVECTOR
并期望一切正常。
答案 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。使用调试器!设置一些断点,检查从每个行的分配位置到错误位置的指针值。