AccessViolation только в оптимизированной сборке Win32 (XMMATRIX)
У меня возникли проблемы с установкой двух переменных типа XMMATRIX** в функции. Прототип функции выглядит так:
bool ViewportFactory::CreateViewport(CanvasHandle* canvasHandlePtr, ViewportHandle** outViewportHandlePtr, DirectX::XMMATRIX** outProjectionMatrix, DirectX::XMMATRIX** outViewMatrix)
Затем, позже в определении функции, у меня есть следующие две строки:
*outProjectionMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);
*outViewMatrix = new DirectX::XMMATRIX(0.0f, 0.1f, /* ... */, 3.3f);
Однако в сборке Win32 с включенными оптимизациями эти строки дают мне нарушение прав доступа.
Трудно понять, в чем именно проблема с включенной оптимизацией, но если я изменю эти строки, чтобы установить значения на nullptr
, то проблема уходит.
1 ответ
Это действительно проблема выравнивания. новый DirectX::XMMATRIX в 32-битной программе выровнен только на 8 байтов, а XMMATRIX должен быть выровнен на 16 байтов.
Вы можете либо использовать __aligned_malloc/__aliged_free вместо new, либо использовать тип XMFLOAT4X4. Или вместо того, чтобы выделять отдельные значения XMMATRIX из кучи, используйте вместо этого выделенный стеком XMMATRIX, который будет правильно выровнен, поскольку XMMATRIX помечен как __declspec(align(16)).
Это описано в Руководстве по программированию DirectXMath для MSDN. Это не длинный документ, и он содержит много советов.