【发布时间】:2011-07-23 13:23:42
【问题描述】:
我有一些类似的代码:
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))。
只要op没有被释放,我如何确保我在那里创建的ctpes数组o没有被释放?
我见过op._objects 属性,它似乎是为此目的而存在的,但它是只读的。
【问题讨论】:
-
您要解决什么问题?为什么你认为这是必要的?
-
@Mark Tolonen:你的问题到底是什么?我的问题是,如何确保
o(或底层ctypes 内存块)在createPtr返回后不被释放。 -
使用上面的代码,它可能会被释放。因此,在某些时候,您可能会遇到段错误。你当然想避免这种情况。
-
只是想知道为什么
o=(ctypes.c_int*3)(1,2,3)还不够? -
@Mark Tolonen:因为就我而言,我需要一个
POINTER(c_int)。如果您对我的工作感兴趣,请参阅here。