<br>Am I the only one seeing a refleak in test_io?<br><br>timberwolf:~/python/python/py3k &gt; ./python -E -tt Lib/test/regrtest.py -R:: test_io<br>test_io<br>beginning 9 repetitions<br>123456789<br>.........<br>test_io leaked [62, 62, 62, 62] references, sum=248
<br>1 test OK.<br><br>It&#39;s in this particular piece of code:<br><br>&nbsp;&nbsp;&nbsp; def test_destructor(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record = []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class MyFileIO(io.FileIO):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def __del__(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record.append
(1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; io.FileIO.__del__(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def close(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record.append(2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; io.FileIO.close(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def flush(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; record.append(3)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; io.FileIO.flush(self)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f = MyFileIO(test_support.TESTFN, &quot;w&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.write(&quot;xxx&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del f<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.assertEqual(record, [1, 2, 3])<br><br>which you can simplify to:
<br><br>&nbsp;&nbsp;&nbsp; def test_destructor(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class MyFileIO(io.FileIO):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f = MyFileIO(test_support.TESTFN, &quot;w&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; del f<br><br>That leaks 30 references each time it&#39;s called. Taking the class definition out of the function stops the leak, so it smells like something, somewhere, is leaking a reference to the MyFileIO class, Instantiating the class is necessary to trigger the leak: the refcount of the class goes up after creating the instance, but does not go down after it&#39;s destroyed. However,&nbsp; creating and destroying another instance does not leak another reference, only the single reference is leaked.
<br><br>I tried recreating the leak with more controllable types, but I haven&#39;t got very far. It seems to be caused by some weird interaction between io.FileIO, _fileio._FileIO and io.IOBase, specifically io.IOBase.__del_
_() calling self.close(), and io.FileIO.close() calling _fileio._FileIO.close() *and* io.RawIOBase.close(). The weird thing is that the contents of RawIOBase.close() doesn&#39;t matter. The mere act of calling RawBaseIO.close
(self) causes the leak. Remove the call, or change it into an attribute fetch, and the leak is gone. I&#39;m stumped.<br><br>-- <br>Thomas Wouters &lt;<a href="mailto:thomas@python.org">thomas@python.org</a>&gt;<br><br>Hi! I&#39;m a .signature virus! copy me into your .signature file to help me spread!