import gc import ctypes import objgraph class libusb_transfer(ctypes.Structure): pass libusb_transfer_p = ctypes.POINTER(libusb_transfer) libusb_transfer_cb_fn_p = ctypes.CFUNCTYPE(None, libusb_transfer_p) libusb_transfer._fields_ = [('callback', libusb_transfer_cb_fn_p)] class USBTransfer(object): __transfer = None __ctypesCallbackWrapper = None def __init__(self): self.__transfer = libusb_transfer() self.__ctypesCallbackWrapper = libusb_transfer_cb_fn_p( self.__callbackWrapper) def close(self): self.__ctypesCallbackWrapper = None # break the cycle (but brutal) #self.__transfer = None # does not break the cycle (bug ?) #self.__transfer.callback = None #self.__transfer.callback = libusb_transfer_cb_fn_p(None) # breaks the cycle (but overcomplex) #self.__transfer.callback = libusb_transfer_cb_fn_p(lambda x: None) def setBulk(self): self.__transfer.callback = self.__ctypesCallbackWrapper def __callbackWrapper(self, transfer_p): pass t = USBTransfer() i = id(t) t.setBulk() t.close() t = None objgraph.show_backrefs([objgraph.at(i)], 20)