Hi Folks,
In the `SetupWheel` function of the Car.js script there is what seems to me like a leak.
The GameObject
variable go
is reused without having been assigned anywhere.
In a third gen language like C/C++, this would certainly cause a memory leak.
A `WheelCollider` `wc` is added to the `go` object, and assigned to the `Wheel` instance,
but go
itself is not assigned to anything. When (if?) wheel
is deleted, it’s collider wc
will get orphaned unless Wheel deletes it, so You’ll leak a WheelCollider, and it’s owner
(the previous go
) will get orphaned even if wc
is deleted, and You’ll leak a GameObject.
However, I'm a C++ programmer and quite new to scripting systems,
so I might be missing some fine point about UnityScript.
Could anyone please throw some light on this?
Is it a leak (as it seems to me), or does it rely on some built in
safety mechanism of the scripting language to save the day?
I’m learning UnityScript, so some enlightenment would be very appreciated.
Thanks and Best Regards
// Love N
[ Here's the function, with my remarks on the spot ]
function SetupWheel( wheelTransform : Transform, isFrontWheel : boolean )
{
var go : GameObject = new GameObject( wheelTransform.name + " Collider" );
go.transform.position = wheelTransform.position;
go.transform.parent = transform;
go.transform.rotation = wheelTransform.rotation;
var wc : WheelCollider = go.AddComponent( typeof( WheelCollider )) as WheelCollider;
wc.suspensionDistance = suspensionRange;
var js : JointSpring = wc.suspensionSpring;
if (isFrontWheel)
js.spring = suspensionSpringFront;
else
js.spring = suspensionSpringRear;
js.damper = suspensionDamper;
wc.suspensionSpring = js;
wheel = new Wheel();
wheel.collider = wc;
wc.sidewaysFriction = wfc;
wheel.wheelGraphic = wheelTransform;
wheel.tireGraphic = wheelTransform.GetComponentsInChildren( Transform )[1];
wheelRadius = wheel.tireGraphic.renderer.bounds.size.y / 2;
wheel.collider.radius = wheelRadius;
if (isFrontWheel)
{
wheel.steerWheel = true;
// 'go' is reused without previous object having been assigned to anything.
// This looks like a classic leak to a driven C++ programmer like me.
// What's the deal here ?
go = new GameObject( wheelTransform.name + " Steer Column" );
go.transform.position = wheelTransform.position;
go.transform.rotation = wheelTransform.rotation;
go.transform.parent = transform;
wheelTransform.parent = go.transform;
}
else
wheel.driveWheel = true;
return wheel;
}