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
```
|