[New-bugs-announce] [issue41977] ctypes array inside structure requires explicit garbage collection

Maximilian Pichler report at bugs.python.org
Thu Oct 8 13:49:07 EDT 2020


New submission from Maximilian Pichler <maxim.pichler at gmail.com>:

If we initialize a `Structure` with two fields as...
```python
s = S()
s.x = (c_int * 10**8)()
s.y = s.x
```
...and then delete it with ```del s```, the memory allocated for the array is not freed until `gc.collect()` is called.

If instead we initalize `s` as...
```python
s = S()
a = (c_int * 10**8)()
s.x = a
s.y = a
del a
```
the memory is freed immediately, no need to garbage collect.

This behaviour seems inconsistent.

Also, if instead of `del s` we do...
```python
s.x = None
s.y = None
```
...memory usage remains high even after garbage collection.

Full code:
```python
import os, sys, gc
from ctypes import *

class S(Structure):
    _fields_ = [ ("x", POINTER(c_int)), ("y", POINTER(c_int)) ]

    def __del__(self):
        print("__del__ was called")

def dump_mem(): os.system(f"ps -o rss {os.getpid()}")

dump_mem() # ~ 6 MB

s = S()
s.x = (c_int * 10**8)()
s.y = s.x

dump_mem() # ~ 397 MB

del s # prints "__del__ was called" immediatly

dump_mem() # ~ 397 MB

gc.collect()

dump_mem() # ~ 6 MB
```

----------
components: ctypes
messages: 378262
nosy: maxim.pichler
priority: normal
severity: normal
status: open
title: ctypes array inside structure requires explicit garbage collection
type: behavior
versions: Python 3.8

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue41977>
_______________________________________


More information about the New-bugs-announce mailing list