我在我正在创建的DLL中使用XNA Math时遇到问题。我有一个DLL中的类,将被导出。它有一个XMVECTOR类型的成员变量。在类构造函数中,我尝试初始化XMVECTOR。从读取位置0x0000000000
读取时出现访问冲突代码运行如下:
class DLLClass
{
public:
DLLClass(void);
~DLLClass(void);
protected:
XMVECTOR vect;
XMMATRIX matr;
}
DLLClass::DLLClass(void)
{
vect = XMLoadFloat3(&XMFLOAT3(0.0f, 0.0f, 0.0f)); //this is the line causing the access violation
}
请注意,此类位于将要导出的DLL中。我不知道这是否会因为进一步的信息而产生影响。
同样在我的时候,我还有另外一个问题:
我也收到警告:struct'_XMMATRIX'需要让dll-interface被'DLLClass'类的客户端使用
这是致命的吗?如果没有,它是什么意思,我怎么能摆脱它?请注意,将导出此DLLClass,DLLClass的“客户端”可能会使用变量“matr”。
任何帮助都将不胜感激。
编辑:只是一些进一步的信息:我逐行调试了代码,似乎在将XMLoadFloat3的返回值分配给vect时发生了错误。
答案 0 :(得分:1)
如果您使用x64本机构建此代码,则此代码是合法的 - 如果您使用__aligned_malloc
来确保所有DLLClass实例的内存都是16字节对齐的。 x86(32位)malloc
和new
默认情况下仅提供8字节对齐。你可以“幸运”#39;但它不稳定。
class DLLClass
{
public:
DLLClass(void);
~DLLClass(void);
protected:
XMVECTOR vect;
XMMATRIX matr;
}
参见 DirectXMath编程指南,Getting Started
您有三种选择:
XMFLOAT4
和XMFLOAT4X4
代替并执行显式加载/存储答案 1 :(得分:0)
您不应该使用匿名变量的地址:
vect = XMLoadFloat3(&XMFLOAT3(0.0f, 0.0f, 0.0f));
你需要
XMFLOAT3 foo(0.0f, 0.0f, 0.0f);
vect = XMLoadFloat3(&foo);