2015-08-19 2 views
2

Lorsque je crée un nouveau btConvexHullShape, j'obtiens une exception de première chance. Code est:Bullet Physics Exception de première chance lors de la création d'un nouveau btConvexHullShape

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

J'ai aussi essayé:

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

L'exception se produit à l'appel et l'appel newresize. L'exception est:

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

Et il se produit à l'intérieur du code source de balle à:

/**@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 
} 

Est-ce un problème connu?

Répondre

1

Cela ressemble à un problème d'alignement de la mémoire. Gardez à l'esprit que presque tous les types de données Bullet sont alignés. Bullet remplace les "nouveaux" opérateurs pour eux. L'utilisation de malloc et de vecteurs est dangereuse avec les types de balle. Au lieu d'utiliser des vecteurs, vous devriez utiliser btAlignedObjectArray. Si vous avez vraiment besoin d'allouer de la mémoire manuellement, vous pouvez essayer d'utiliser l'allocation alignée. Pour l'allocation de mémoire, la puce utilise btAlignedAlloc. Ou vous pouvez simplement créer votre tableau de la façon suivante:

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

Correction de mon problème merci! Quel alignement de mémoire utilise-t-il? J'ai créé une pile personnalisée afin que je puisse aligner la mémoire! Quel alignement les objets nécessitent-ils? – Student123

+0

Bullet utilise un alignement de 16 octets. Vous pouvez voir comment cela se fait dans btScalar.h, où toutes les remplacements d'allocation de mémoire sont. – Estiny