ctypes & allocated memory

Miki Tebeka miki.tebeka at gmail.com
Sun Jun 7 09:39:21 EDT 2020


> Does ctypes, when using restype, frees allocated memory?
> 
> For example, will the memory allocated by "strdup" be freed after the "del" statement? If not, how can I free it?

I've tried the following program and I'm more confused now :) Can anyone explain the output?

---
import ctypes
import gc
import resource


def mem_usage():
    return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss


libc = ctypes.cdll.LoadLibrary('libc.so.6')
strdup = libc.strdup
strdup.argtypes = [ctypes.c_char_p]
strdup.restype = ctypes.c_char_p

size = 1 << 20
print(f'size: {size:,}')
data = b'x' * size  # 1MB

mb = mem_usage()
print(f'memory before: {mb:,}')

n = 1000
print(f'n: {n:,}')
for _ in range(n):
    strdup(data)
gc.collect()

ma = mem_usage()
diff = ma - mb
print(f'memory after: {ma:,}')
print(f'diff: {diff:,}')
print(f'diff/size: {diff/size:.2f}')
---

Which prints
---
size: 1,048,576
memory before: 21,556
n: 1,000
memory after: 1,035,180
diff: 1,013,624
diff/size: 0.97
---


More information about the Python-list mailing list