C++ XMMatrixTranspose访问冲突读取位置0xFFFFFFFF

C++ XMMatrixTranspose访问冲突读取位置0xFFFFFFFF,c++,directx,directx-11,C++,Directx,Directx 11,我有一个DirectX 11项目,我正在使用《DirectX 11游戏编程入门》一书,阅读所有章节。我已经安装好了我的相机,它一直在工作,没有崩溃。但是最近在调试我的Obj加载器时,我发现它一直在XMMatrixTranspose行上崩溃,我交换了我的视图矩阵和投影矩阵,看看它是否特定于我的视图矩阵,而不是 下面是导致错误的代码块 vMatrix = camera.GetViewMatrix(); vMatrix = XMMatrixTranspose(vMatrix); pMatrix =

我有一个DirectX 11项目,我正在使用《DirectX 11游戏编程入门》一书,阅读所有章节。我已经安装好了我的相机,它一直在工作,没有崩溃。但是最近在调试我的Obj加载器时,我发现它一直在
XMMatrixTranspose
行上崩溃,我交换了我的视图矩阵和投影矩阵,看看它是否特定于我的视图矩阵,而不是

下面是导致错误的代码块

vMatrix = camera.GetViewMatrix();
vMatrix = XMMatrixTranspose(vMatrix);

pMatrix = XMMatrixPerspectiveFovLH(XM_PIDIV4, (float)(screenWidth / screenHeight), 0.01f, 100.0f);
pMatrix = XMMatrixTranspose(pMatrix);
这可以在我的
DX11::Render
函数中找到。这在我的
main.cpp
游戏循环中调用,如下所示

MSG msg = { 0 };

while (msg.message != WM_QUIT)
{
    if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    else
    {
        directX->Update(0.0f);
        directX->Render();
    }
}

directX->Shutdown();
我所有的变量都有内存,这段代码以前一直在工作,当它开始这样做时,它会断断续续地这样做,但现在它似乎一直在这样做

任何帮助和指导都将是惊人的!我已经研究了几个小时,但找不到任何有效的,我已经有这个问题大约7个小时了!该走了

提前谢谢

更新它现在又回到间歇性崩溃状态


更新2我也在使用xnamath而不是DXMath

您应该首先阅读MSDN程序员指南,特别是

DirectXMath和XNAMath基本上是同一个库。XNAMath只是它的旧版本,上一次更新是在2011年。您应该使用DirectXMath。看

最可能的问题是,您试图使用堆上声明的
XMMATRIX
和/或
XMMVECTOR
类型(即,在您使用
new
on的类中),这些类型对于x86(32位)和ARM构建不会正确对齐。它恰好符合x64本机代码的要求,但这基本上是一个令人高兴的意外

换句话说,以下代码将在x86(32位)和ARM中生成AV,具体取决于内存的布局方式,但适用于x64本机:

struct A
{
    XMMATRIX m;
};

A a = new A;
a->m = XMMatrixIdentity();
要使其在所有体系结构上稳定工作,您需要使用:

struct A
{
    XMFLOAT4X4 m;
};

A a = new A;
XMStoreFloat4x4(&A->m, XMMatrixIdentity());
您可以使用
XMFLOAT4X4
或类中不需要对齐的类似类型,然后使用显式加载/保存函数。注意,您还可以根据矩阵内容使用更紧凑的表单,如
XMFLOAT4X3

可选地,您可以利用包装器,它通过C++转换运算符和构造函数的功率,仅“自动地”。

struct A
{
    Matrix m;
};

A a = new A;
A->m = XMMatrixIdentity();
// Note this is redundant
// as the Matrix default constructor sets it to identity already.
此功能不是基本库的一部分,因为它具有某些性能影响。通过使其成为SimpleMath包装的一部分,它允许用户选择更简单的使用模型,同时防止其他人意外使用较慢的转换路径


可能重复Yes,因为它使用的是XMMatrixTranspose函数。Zach,XMMATRIX变量未对齐的问题是众所周知的,并且只给出了您看到的症状。我建议您尝试链接答案中的建议。我也没有使用DXMath,我使用的是xnamath,我将更新问题,请注意,Frank Luna的书是DIrect3D 11.0 API的一个很好的介绍,但大量使用了传统的DirectX SDK,这本书的日期比看起来的要长。D3DX11已被弃用,XNAMath被DirectXMath取代,Effects 11有自己的一套警告。谢谢你的帮助,我没有看你的答案就解决了这个问题,我发现这是因为堆,但是考虑到你的解决方案实际上更优雅,并准确地解释了我的问题,我接受了:)