8

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 ++はすでに破棄されています(そして他のヒープ割り当てで上書きされています)。私の実際の状況では、これがセグメンテーション違反を引き起こしています。theFoovalue.valueBar().theFoo.theFoo

ここに戻るExample.iためにファイルに追加できるSWIGディレクティブまたはトリックはありますか?Bar().theFoo.value1

4

2 に答える 2