2012-10-26 1 views
1

에 충돌는 BulletSharp는 다음 시작을 사용하여 응용 프로그램 종료

 Utility.SafeDispose(bulletDynamicsWorld); 
     Utility.SafeDispose(constraintSolver); 
     Utility.SafeDispose(broadPhaseCollisionInterface); 
     Utility.SafeDispose(collisionDispatcher); 
     Utility.SafeDispose(collisionConfiguration); 
     Utility.SafeDispose(bulletCollisionWorld); <<< The error happens here >>> 

강조 표시된 행을 실행하는 데 다음 오류가 발생합니다.

"런타임에 치명적인 오류가 발생했습니다. 오류의 주소는 0x6b1c9704, 스레드 0x1378에있었습니다. 오류 코드는 0xc0000005입니다. 이 오류는 CLR 또는 안전하지 않거나 확인할 수없는 사용자 코드 부분의 버그 일 수 있습니다. 이 버그의 일반적인 소스는 스택 손상 할 수있다, COM-상호 운용성 또는 PInvoke를위한 사용자 마샬링 오류가 "

참고 :.

1) 즉 충돌 개체 또는 동적 객체가없는 모든 총알 코드입니다. 추가되었다.

2) Utility.SafeDispose()는 IDiposable 소요 널 값에 대한 검사가 .Dispose()를 그 유효하다면.

3) 언어, C#을 분명히하기 위해 요구한다.

4) Utility.SafeD의 위치 .SafeDispose 문 목록에서 ispose (CollisionWorld)가 효과가없는 것 같습니다.

왜 충돌이 발생하며 어떻게 해결합니까?

감사합니다.

+0

'2) Utility.SafeDispose()는 IDiposable을 가져오고 null 값을 검사하고 해당 유효성 검사에 .Dispose()가 호출되면 경쟁 조건처럼 냄새가납니다. – asawyer

+0

어떻게 그렇게됩니까? "if (disposable! = null) disposable.Dispose();"와 다르지 않습니다. –

+0

http://blogs.msdn.com/b/ericlippert/archive/2009/04/29/events-and-races.aspx 제가이 문제를 말하고있는 것은 아니며,보아야 할 것입니다. – asawyer

답변

2

bulletCollisionWorld를 삭제하면 broadPhaseCollisionInterface에 액세스하여 전 세계에서 만든 충돌 쌍을 지 웁니다. 세상을 처분하기 전에 명시 적으로 충돌 인터페이스를 처리하기 때문에 세계는 잘못된 포인터에 액세스합니다.

따라서 해결 방법은 두 세계를 먼저 처리 한 다음 충돌 인터페이스를 처리하는 것입니다.

0

DiscreteDynamicsWorld는 충돌 세계입니다. 여분의 충돌 세계를 제거하면 오류가 발생하지 않습니다. 그러므로 문제는 아마 두 개의 충돌 세계를 가지고있었습니다. 일부 전역이있는 것으로 보입니다.