从DirectXMath使用XMVECTOR作为类成员只能导致在发布模式崩溃?(Using XMVE

2019-08-18 20:51发布

我一直在试图使用XMVECTOR作为类成员的边界框,因为我做了很多的计算,但我每帧使用XMFLOAT3只有一次,所以边框有给我它的中心在XMFLOAT3的方法,否则停留在XMVECTOR;类用__declspec delcared(对齐(16)),并在释放模式调试mode.However作品它崩溃我将它设置的东西的瞬间:

    Box& Box::operator=(const Box& box)
    {
        _center = box._center;
        _extents = box._extents;
        return *this;
    }

每当我做的:

Box A;

Box B;

A = B;

它崩溃,给我0000005:访问冲突读取位置00000000。 此外,它崩溃,当我创建它作为一个指针:

Box* A = new Box();

这是构造函数:

    Box::Box()
    {
        center = XMVectorZero();
        extents = XMVectorSplatOne();
    }

同样,这个工作在调试模式很好,但在释放它crashes.What可以拍摄模式的改变会产生无效代码?我需要做别的事情,比盒子对准16个字节的?

Answer 1:

在对齐的地址不被创建的类,所以尽管XM *成员按16字节边界对齐,父母的对准误对准他们,导致崩溃。

为了防止这一点,你需要使用_mm_alloc (这实际上只是包含_aligned_alloc ),或一个返回最小对齐为16个字节的块(在x64这与默认的分配情况)替换默认分配器。

一个简单的解决方案,这在C ++是创建一个基类中含有XM *成员,看起来像下面的所有类:

template<size_t Alignment> class AlignedAllocationPolicy
{
    public:
    static void* operator new(size_t size)
    {
        return _aligned_malloc(size,Alienment);
    }

    static void operator delete(void* memory)
    {
        _aligned_free(memory);
    }
};

class MyAlignedObject : public AlignedAllocationPolicy<16>
{
//...
};

正如@戴夫指出,这是一个小例子,你会想重载所有 newdelete运营商,特别是new[]delete[]



文章来源: Using XMVECTOR from DirectXMath as a class member causes a crash only in Release Mode?