Hi all,
I was playing around with finalization and garbage collection the
other day and I had a thought. Since a finalizer automatically insures
that objects are not garbage collected in generation zero, and since
destructor syntax in C# and managed C++ are used to declare finalizers,
what happens if you have an empty destructor? Obviously it would be nice
if the compilers noticed that your destructor is empty and thus did not
generate the code for a finalizer which makes your objects stick around
longer. Alas, this is not the case as the following code examples show.
No major issue but something I thought was worth passing along. I could
see this being an issue for people writing code generators who are used to
working in C++ who might forget that a destructor in unmanaged C++ is not
the same as a "destructor/finalizer" in managed C++.
Enjoy
Jay
Code examples for C# and MCPP
C#
class FinalizedClass
{
static void Main(string[] args)
{
}
// provide empty destructor
~FinalizedClass()
{
}
}
turns into the following IL (as you can see in ILDASM)
.method family hidebysig virtual instance void
Finalize() cil managed
{
// Code size 10 (0xa)
.maxstack 1
.try
{
IL_0000: leave.s IL_0009
} // end .try
finally
{
IL_0002: ldarg.0
IL_0003: call instance void [mscorlib]System.Object::Finalize()
IL_0008: endfinally
} // end handler
IL_0009: ret
} // end of method FinalizedClass::Finalize
Managed C++
__gc class FinalizedClass
{
FinalizedClass(){};
~FinalizedClass(){};
};
turns into the following (more efficient and yet still present) IL
.method family virtual instance void Finalize() cil managed
{
// Code size 1 (0x1)
.maxstack 0
IL_0000: ret
} // end of method FinalizedClass::Finalize
You can read messages from the Advanced DOTNET archive, unsubscribe from Advanced
DOTNET, or
subscribe to other DevelopMentor lists at http://discuss.develop.com.