<br><font size=2 face="sans-serif">Look at the following code, which is
meant to be a stripped-down and simplified version of my real code:</font>
<br>
<br><font size=2 face="sans-serif">Class DatabaseMgr</font>
<br>
<br><font size=2 face="sans-serif">DatabaseMgr instproc openDatabase {}
{</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; Database [self]::db</font>
<br><font size=2 face="sans-serif">}</font>
<br>
<br><font size=2 face="sans-serif">Class Database</font>
<br>
<br><font size=2 face="sans-serif">Database instproc init {} {</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; puts &quot;init [self]&quot;</font>
<br><font size=2 face="sans-serif">}</font>
<br>
<br><font size=2 face="sans-serif">Database instproc destroy {} {</font>
<br><font size=2 face="sans-serif">&nbsp; &nbsp; puts &quot;destroy [self]&quot;</font>
<br><font size=2 face="sans-serif">}</font>
<br>
<br><font size=2 face="sans-serif">DatabaseMgr dbmgr</font>
<br>
<br><font size=2 face="sans-serif">dbmgr openDatabase</font>
<br>
<br><font size=2 face="sans-serif">dbmgr::db info class</font>
<br><font size=2 face="sans-serif">dbmgr::db destroy</font>
<br><font size=2 face="sans-serif">dbmgr::db info class</font>
<br>
<br><font size=2 face="sans-serif">The second call to &quot;info class&quot;
should fail but doesn't. That's because the object isn't actually destroyed.
(In my real code the objects have dynamically generated names; I used the
static names to simplify the example.)</font>
<br>
<br><font size=2 face="sans-serif">The above style is similar to the style
of code used in xoRBAC (eg, factories &amp; self-destruction) so I'd be
surprised if it too wasn't leaking objects.</font>
<br>
<br><font size=2 face="sans-serif">After the above code run this code:</font>
<br>
<br><font size=2 face="sans-serif">dbmgr info class</font>
<br><font size=2 face="sans-serif">dbmgr destroy</font>
<br><font size=2 face="sans-serif">dbmgr info class</font>
<br>
<br><font size=2 face="sans-serif">Now both dbmgr and dbmgr::db are destroyed--but
note that the &quot;destructor&quot; gets called twice at this point!</font>
<br>
<br><font size=2 face="sans-serif">By contrast, the following example (which
also uses nested/aggregated objects) succeeds (which is to say that the
second call to &quot;info class&quot; fails):</font>
<br>
<br><font size=2 face="sans-serif">Object instproc doSomethingAndDie {}
{[self] destroy}</font>
<br><font size=2 face="sans-serif">set xxx [Object new]</font>
<br><font size=2 face="sans-serif">set yyy [Object new -childof $xxx]</font>
<br><font size=2 face="sans-serif">set zzz [Object new -childof $yyy]</font>
<br><font size=2 face="sans-serif">puts &quot;[$yyy info class]&quot;</font>
<br><font size=2 face="sans-serif">$yyy doSomethingAndDie</font>
<br><font size=2 face="sans-serif">puts &quot;[$yyy info class]&quot;</font>
<br>