Python ctypes指针和分配的内存



假设我想使用ctypes将指向int的指针传递给Python中的C函数:

from ctypes import *
lib = CDLL("./myLib.so")
i = c_int(50)
pi = pointer(i)
lib.myfunc(pi)

此代码没有问题。但假设我这样做:

from ctypes import *
lib = CDLL("./myLib.so")
pi = pointer(c_int(50))
lib.myfunc(pi)

垃圾收集器会发生什么情况?在第一个示例中,指向的内容通过i变量引用。但我不确定他们是否在第二个。没有引用这些内容的变量。它可以被垃圾收集吗?还是指针指向它的唯一事实使内容得到了安全分配?

创建pointer-对象时,它会保留对原始对象的引用,从而防止原始对象被破坏。

您可以使用以下代码验证此行为:

from ctypes import *
import sys
i = c_int(50)
print(sys.getrefcount(i)) # => 2 - a reference from i and one as argument of sys.getfrefcount
pi = pointer(i)
print(sys.getrefcount(i)) # => 3 - additional reference is saved in pi
del pi
print(sys.getrefcount(i)) # => 2 again - the reference from pi was cleared

这意味着,在第二个版本中也不会有悬挂指针,并且它是保存使用的。

最新更新