diff --git a/Lib/test/test_array.py b/Lib/test/test_array.py index 58ea89c4fac833..83b3c978da3581 100755 --- a/Lib/test/test_array.py +++ b/Lib/test/test_array.py @@ -1255,6 +1255,14 @@ def test_typecode_u_deprecation(self): with self.assertWarns(DeprecationWarning): array.array("u") + def test_empty_string_mem_leak_gh140474(self): + with warnings.catch_warnings(): + warnings.simplefilter('ignore', DeprecationWarning) + for _ in range(1000): + a = array.array('u', '') + self.assertEqual(len(a), 0) + self.assertEqual(a.typecode, 'u') + class UCS4Test(UnicodeTest): typecode = 'w' diff --git a/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst b/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst new file mode 100644 index 00000000000000..aca4e68b1e5e49 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-10-22-20-52-13.gh-issue-140474.xIWlip.rst @@ -0,0 +1,2 @@ +Fix memory leak in :class:`array.array` when creating arrays from an empty +:class:`str` and the ``u`` type code. diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c index 5d07de2fba9526..39d505c02596b8 100644 --- a/Modules/arraymodule.c +++ b/Modules/arraymodule.c @@ -2838,6 +2838,9 @@ array_new(PyTypeObject *type, PyObject *args, PyObject *kwds) Py_SET_SIZE(self, n); self->allocated = n; } + else { + PyMem_Free(ustr); + } } else { // c == 'w' Py_ssize_t n = PyUnicode_GET_LENGTH(initial);