我遇到了一个有趣的发现,涉及SWIG如何处理包含其他结构作为成员的C结构的引用计数.
我发现在我将数据从结构子成员存储到其他python对象(列表/ dicts)的情况下使用它们之前,我的python SWIG对象正在收集垃圾.经过一段时间的挖掘后,我发现SWIG-ed结构成员似乎没有自己的独立引用计数,即使解释器表明它们是"Swig Objects".因此,当我将结构子元素中的数据添加到我的列表时,python不知道我已经添加了对此数据的引用.
我创建了一个简单的案例来演示.我SWIG-ed以下3个结构:
SWIG-ed C结构:
typedef struct
{
unsigned long source;
unsigned long destination;
} message_header;
typedef struct
{
unsigned long data[120];
} message_large_body;
typedef struct
{
message_header header;
message_large_body body;
} large_message;
Run Code Online (Sandbox Code Playgroud)
然后我创建了一个稍微等效的python类来比较纯SWIG-ed解决方案的行为.
有点等效的Python类
class pyLargeMessage(object):
def __init__(self):
self.header = bar.message_header()
self.body = bar.message_large_body()
Run Code Online (Sandbox Code Playgroud)
然后我在解释器中运行了以下测试.
Python解释器结果
>>> y = pyLargeMessage()
>>> y
<__main__.pyLargeMessage object at 0x06C5E6B0>
>>> y.header
<Swig Object of type 'message_header *' at 0x06C5E700>
>>> sys.getrefcount(y.header)
3
>>> z = [y.header]
>>> sys.getrefcount(y.header)
3 …
Run Code Online (Sandbox Code Playgroud)