小编tne*_*123的帖子

包含复杂类型的SWIG-ed C结构的引用计数似乎没有按预期工作

我遇到了一个有趣的发现,涉及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)

python swig struct

6
推荐指数
1
解决办法
694
查看次数

标签 统计

python ×1

struct ×1

swig ×1