]> granicus.if.org Git - python/commitdiff
Closes #15488: Closed files keep their buffer alive
authorJesus Cea <jcea@jcea.es>
Thu, 4 Oct 2012 10:37:56 +0000 (12:37 +0200)
committerJesus Cea <jcea@jcea.es>
Thu, 4 Oct 2012 10:37:56 +0000 (12:37 +0200)
Lib/test/test_io.py
Misc/NEWS
Modules/_io/bufferedio.c

index d5eec7c2215f7b835628643bb4de9e0f7d7715de..ec0501e901368b5e4d17cf17939b61882e3a24cb 100644 (file)
@@ -815,6 +815,14 @@ class SizeofTest:
         bufio = self.tp(rawio, buffer_size=bufsize2)
         self.assertEqual(sys.getsizeof(bufio), size + bufsize2)
 
+    @support.cpython_only
+    def test_buffer_freeing(self) :
+        bufsize = 4096
+        rawio = self.MockRawIO()
+        bufio = self.tp(rawio, buffer_size=bufsize)
+        size = sys.getsizeof(bufio) - bufsize
+        bufio.close()
+        self.assertEqual(sys.getsizeof(bufio), size)
 
 class BufferedReaderTest(unittest.TestCase, CommonBufferedTests):
     read_mode = "rb"
index 3b8ec219ef2d2b423eb6b688317bd3fcadf0c087..042b3ccb77c79084db6eafea2527ef2263fd1397 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -24,6 +24,9 @@ Core and Builtins
 
 - Issue #15839: Convert SystemErrors in `super()` to RuntimeErrors.
 
+- Issue #15448: Buffered IO now frees the buffer when closed, instead
+  of when deallocating.
+
 - Issue #15846: Fix SystemError which happened when using `ast.parse()` in an
   exception handler on code with syntax errors.
 
index 334734beccbae8d3d4271eaeb973c46460a620cd..432349a7f6370c55f897576d90610932f4a47f59 100644 (file)
@@ -519,6 +519,11 @@ buffered_close(buffered *self, PyObject *args)
 
     res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_close, NULL);
 
+    if (self->buffer) {
+        PyMem_Free(self->buffer);
+        self->buffer = NULL;
+    }
+
 end:
     LEAVE_BUFFERED(self)
     return res;