如何在python中修改对象大小

时间:2016-11-03 14:37:15

标签: python garbage-collection

我们有以下代码:

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是唯一的方法。

1 个答案:

答案 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)