This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: ctypes array inside structure requires explicit garbage collection
Type: behavior Stage:
Components: ctypes Versions: Python 3.8
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: FFY00, maxim.pichler
Priority: normal Keywords:

Created on 2020-10-08 17:49 by maxim.pichler, last changed 2022-04-11 14:59 by admin.

Messages (1)
msg378262 - (view) Author: Maximilian Pichler (maxim.pichler) Date: 2020-10-08 17:49
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
```
History
Date User Action Args
2022-04-11 14:59:36adminsetgithub: 86143
2020-10-12 12:55:19FFY00setnosy: + FFY00
2020-10-08 17:49:07maxim.pichlercreate