У меня есть код, похожий на этот:
def castArgToCtype(arg, ctyp):
if issubclass(ctyp, _ctypes._Pointer): return createPtr(arg, ctyp)
return ctyp(arg)
def createPtr(arg, ctyp):
assert isinstance(arg, (list,tuple))
assert issubclass(ctyp, _ctypes._Pointer)
o = (ctyp._type_ * (len(arg) + 1))()
for i in xrange(len(arg)):
o[i] = castArgToCtype(arg[i], ctyp._type_)
op = ctypes.cast(ctypes.addressof(o), ctyp)
# TODO: what when 'o' goes out of scope and freed?
return op
И я называю это как createPtr((1,2,3), ctypes.POINTER(ctypes.c_int))
.
Как я могу убедиться, что созданный там массив ctpes o
не освобождается, пока op
не освобожден?
Я видел атрибут op._objects
, который, кажется, даже существует для этой цели, но доступен только для чтения.