我们有以下代码:
import ctypes
libc = ctypes.CDLL("libc.so.6")
class Buf(object):
def __init__(self, size):
self.__addr = libc.malloc(size)
def __del__(self):
libc.free(self.__addr)
生产代码更复杂,就是有一些类似RAII的对象使用libc
分配和释放内存。
有没有办法告知垃圾收集器这个对象的完整大小 - 它已经知道的大小+用libc
分配的内存大小?
我知道我可以使用ctypes实现类似的分配:
def createBuf(size):
class Buf(ctypes.Structure):
_pack_ = 1
_fields_ = [("data", ctypes.c_ubyte*size)]
return Buf()
但由于某种原因,让我们假设直接使用libc是唯一的方法。
答案 0 :(得分:0)
垃圾收集器不需要知道任何事情,只需释放2016-10-11 10:45:00.0
函数中的每个分配。
__del__
你甚至可以让Buf成为ctypes.c_void_p的子类,并使用libc.free(self)释放Buf指针,如果你也用
创建它class Buf(object):
def __init__(self, size):
self.__addr = libc.malloc(size)
self.pointers = {}
def allocate(name, size, amount):
self.pointers[name] = libc.calloc(amount, size)
def get(name):
return self.pointers[name]
def __del__(self):
for pointer in self.pointers:
libc.free(pointer)
libc.free(self.__addr)