New submission from Benjamin Gilbert <[email protected]>:
Section 15.17.1.15 of the ctypes documentation illustrates the use of cast()
thusly:
>>> a = (c_byte * 4)()
>>> cast(a, POINTER(c_int))
<ctypes.LP_c_long object at ...>
>>>
Executing the cast() causes a._objects to gain a reference back to a:
>>> a = (c_byte * 4)()
>>> a._objects
>>> cast(a, POINTER(c_int))
<__main__.LP_c_int object at 0x7fb879065b90>
>>> a._objects
{140430281170384: <__main__.c_byte_Array_4 object at 0x7fb879065dd0>}
>>> a
<__main__.c_byte_Array_4 object at 0x7fb879065dd0>
>>>
If large temporary arrays are allocated, cast, used, and discarded in a tight
inner loop, a lot of memory can thus be consumed by self-referencing objects
before the garbage collector has a chance to run. Even if this behavior is
correct from the perspective of ctypes, it is surprising.
----------
components: ctypes
messages: 142933
nosy: bgilbert
priority: normal
severity: normal
status: open
title: cast() creates circular reference in original object
type: resource usage
versions: Python 2.7
_______________________________________
Python tracker <[email protected]>
<http://bugs.python.org/issue12836>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com