A decorator for detecting memory leaks in python
I thought I had a memory leak in a program I was writing for my wife today and found this awesome answer on StackOverflow. I turned it into a decorator to I could detect memory leaks more easily in the future. The code for the decorator is below.
def report_memory_leaked(f): """ Counts objects allocated in memory before and after the decorated function and reports the results. If you decorate a function like @report_memory_leaked def myfunc(): pass # do stuff It will report objects by type that were leaked or created. """ from collections import defaultdict from gc import get_objects import logging def obj_counting_wrapper(*args, **kwargs): before=defaultdict(int) for i in get_objects():before[type(i)]+=1 retval = f(*args, **kwargs) after=defaultdict(int) for i in get_objects():after[type(i)]+=1 leaked_or_returned = [(k,after[k]-before[k]) for k in
after if after[k]-before[k]]
if leaked_or_returned: logging.debug('Leaked or returned:\n%r' % leaked_or_returned) return retval return obj_counting_wrapper



1 year ago