From a790e172d0281e64517ff44d80f1c0139c3ab665 Mon Sep 17 00:00:00 2001 From: Porteries Tristan Date: Tue, 11 Aug 2015 12:56:57 +0200 Subject: [PATCH] BGE: Fix T38448: Bullet constraint memory leak. --- .../Physics/Bullet/CcdPhysicsEnvironment.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp index 53c007f256c..273e7323514 100644 --- a/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp +++ b/source/gameengine/Physics/Bullet/CcdPhysicsEnvironment.cpp @@ -537,8 +537,18 @@ bool CcdPhysicsEnvironment::RemoveCcdPhysicsController(CcdPhysicsController* ctr con->getRigidBodyA().activate(); con->getRigidBodyB().activate(); m_dynamicsWorld->removeConstraint(con); + + // The other physics controller in the constraint, can't be NULL. + CcdPhysicsController *otherCtrl = (body == &con->getRigidBodyA()) ? + (CcdPhysicsController *)con->getRigidBodyB().getUserPointer() : + (CcdPhysicsController *)con->getRigidBodyA().getUserPointer(); + + otherCtrl->removeCcdConstraintRef(con); ctrl->removeCcdConstraintRef(con); - //delete con; //might be kept by python KX_ConstraintWrapper + /** Since we remove the constraint in the onwer and the target, we can delete it, + * KX_ConstraintWrapper keep the constraint id not the pointer, so no problems. + */ + delete con; } m_dynamicsWorld->removeRigidBody(ctrl->GetRigidBody());