当创建新的btConvexHullShape时,子弹物理第一次出现异常

Bullet Physics First Chance Exception When Creating New btConvexHullShape

本文关键字:第一次 异常 子弹 创建 btConvexHullShape      更新时间:2023-10-16

当我创建一个新的btConvexHullShape时,我得到一个第一次机会异常。代码:

btConvexHullShape* m_collisionShapes;
m_collisionShapes = static_cast<btConvexHullShape*>(malloc(sizeof(btConvexHullShape)* MAX_BODY_COUNT));
new (&m_collisionShapes[m_activeBodyCount]) btConvexHullShape();

我也试过:

std::vector<btConvexHullShape> m_hulls;
m_hulls.resize(MAX_BODY_COUNT);

newresize呼叫异常。例外是:

  Unhandled exception at 0x0102C983 in Useful_Engine.exe: 
0xC0000005: Access violation reading location 0xFFFFFFFF.

它出现在项目符号源代码的内部:

/**@brief Return the elementwise product of two vectors */
SIMD_FORCE_INLINE btVector3 
operator*(const btVector3& v1, const btVector3& v2) 
{
#if defined(BT_USE_SSE_IN_API) && defined (BT_USE_SSE)
    return btVector3(_mm_mul_ps(v1.mVec128, v2.mVec128));
#elif defined(BT_USE_NEON)
    return btVector3(vmulq_f32(v1.mVec128, v2.mVec128));
#else
    return btVector3(
            v1.m_floats[0] * v2.m_floats[0], 
            v1.m_floats[1] * v2.m_floats[1], 
            v1.m_floats[2] * v2.m_floats[2]);
#endif
}

这是已知的问题吗?

这看起来像是内存对齐问题。请记住,几乎所有的Bullet数据类型都是对齐的。对他们来说,Bullet凌驾于"新"运营商之上。对于子弹类型,使用malloc和vector是危险的。而不是使用向量,你应该使用btAlignedObjectArray。如果你真的需要手动分配内存,你可以尝试使用对齐分配。对于内存分配子弹使用btAlignedAlloc。或者你可以用下面的方法创建你的数组:

btAlignedObjectArray<btConvexHullShape> m_hulls;
m_hulls.resize(MAX_BODY_COUNT);