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
2番目の例では、のフィールドBar
を読み取る前に一時オブジェクトが破棄されているようです。gdbで物事を追いかけていると、これが明らかに起こっていることです。したがって、から読み取るまでに、C ++はすでに破棄されています(そして他のヒープ割り当てで上書きされています)。私の実際の状況では、これがセグメンテーション違反を引き起こしています。theFoo
value
.value
Bar().theFoo
.theFoo
ここに戻るExample.i
ためにファイルに追加できるSWIGディレクティブまたはトリックはありますか?Bar().theFoo.value
1