#739 – Avoid Accessing an Object After Its Been Finalized
December 19, 2012 Leave a comment
A finalizer should not create a new reference to the object being finalized. Below is an example where doing this leads to the ability to reference the object after it’s been finalized.
This is an example of questionable code–in general, it’s dangerous to reconstitute an object after it’s been finalized.
In the Dog class, we save a reference to the object being finalized.
public class Dog { public static Dog KeepDogRef; public string Name { get; set; } public Dog(string name) { Name = name; } ~Dog() { Console.WriteLine("Dog destructor for " + Name + " called"); Dog.KeepDogRef = this; } public void Bark() { Console.WriteLine(Name + " : Woof"); } }
In main program, we reconstitute a Dog object after it’s been finalized.
Dog dog = new Dog("Bowser"); WeakReference dogRef = new WeakReference(dog); // Unref Bowser dog = null; GC.Collect(); GC.WaitForPendingFinalizers(); // Bowser is gone Console.WriteLine(string.Format("Object still alive: {0}", dogRef.IsAlive)); // Hey, Bowser is alive again! Dog newRef = Dog.KeepDogRef; newRef.Bark();