创建新 btConvexHullShape 时 Bullet Physics 第一次机会异常
Bullet Physics First Chance Exception When Creating New btConvexHullShape
当我创建一个新的 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);
异常发生在new
调用和resize
调用。例外情况是:
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 为它们覆盖 "new" 运算符。使用 malloc 和 vector 对项目符号类型是危险的。您应该使用 btAlignedObjectArray 而不是使用向量。如果你真的需要手动分配内存,你可以尝试使用对齐分配。对于内存分配,项目符号使用 btAlignedAlloc。或者您可以通过以下方式创建数组:
btAlignedObjectArray<btConvexHullShape> m_hulls;
m_hulls.resize(MAX_BODY_COUNT);
当我创建一个新的 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);
异常发生在new
调用和resize
调用。例外情况是:
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 为它们覆盖 "new" 运算符。使用 malloc 和 vector 对项目符号类型是危险的。您应该使用 btAlignedObjectArray 而不是使用向量。如果你真的需要手动分配内存,你可以尝试使用对齐分配。对于内存分配,项目符号使用 btAlignedAlloc。或者您可以通过以下方式创建数组:
btAlignedObjectArray<btConvexHullShape> m_hulls;
m_hulls.resize(MAX_BODY_COUNT);