2月12日编辑
我最近刚刚为一些 C++ 类使用一些 SWIG 生成的 Python 包装器出现了一个奇怪的崩溃。看来 SWIG 和 Python 结合在一起有点急于清理临时值。事实上,如此渴望,以至于它们在仍在使用时就被清理干净了。一个显着压缩的版本如下所示:
/* Example.hpp */
struct Foo {
int value;
~Foo();
};
struct Bar {
Foo theFoo;
Bar();
};
/* Example.cpp */
#include "Example.hpp"
Bar::Bar() {theFoo.value=1;}
Foo::~Foo() {value=0;}
/* Example.i */
%module Example
%{
#include "Example.hpp"
%}
%include "Example.hpp"
我在 .i 文件上运行 SWIG (1.3.37),然后在 Python 中,有:
Python 2.4.3 (#1, Sept 17 2008, 16:07:08)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-41)] on linux2
Type "help", "copyright", "credits", or "license" for more information.
>>> from Example import Bar
>>> b=Bar()
>>> print b.theFoo.value # expect '1', since Bar's constructor sets this
1
>>> print Bar().theFoo.value # expect '1', since we're still using the Foo object
26403424
似乎在第二种情况下,临时对象在我们到达 read的字段Bar
之前就被销毁了。在 gdb 中追逐东西,这显然是正在发生的事情。因此,当我们从 中读取时,C++ 已经销毁(并被其他一些堆分配覆盖)。在我的实际情况下,这会导致段错误。theFoo
value
.value
Bar().theFoo
.theFoo
是否有任何 SWIG 指令或技巧可以添加到我的Example.i
文件中以在此处Bar().theFoo.value
返回1
?