1

親子関係を使用してC++で依存関係を設定しようとしています。親には子が含まれ、子には親への弱いポインタがあります。

また、Pythonで親から派生できるようにしたいと思います。ただし、これを行うと、この親子関係を接続する弱いポインタエラーが発生します。

C ++コード:

#include <boost/python.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>

using namespace boost;
using namespace boost::python;

struct Child;

struct Parent : public enable_shared_from_this<Parent>
{
    void initialize();
    shared_ptr<Child> m_child;
};

struct Child: public enable_shared_from_this<Child>
{
    void setParent(shared_ptr<Parent> ptr);
    weak_ptr<Parent> m_parent;
};

void Parent::initialize()
{
    shared_ptr<Child> ptr(new Child);
    m_child = ptr;

    m_child->setParent(shared_from_this());
}

void Child::setParent(shared_ptr<Parent> ptr)
{
    m_parent = ptr;
}

static PyObject* create(PyObject* object)
{
    PyObject* instance = PyObject_CallObject(object, NULL);

    Parent* parent = extract<Parent*>(instance);
    parent->initialize();

    return instance;
}

Pythonバインディング:

BOOST_PYTHON_MODULE(test_module)
{
    class_<Parent>("Parent");

    def("create", &create);
} 

Pythonコード:

from test_module import *

class Test(Parent):
    def __init__(self):
        Parent.__init__(self)

n = create(Test)

エラー:

Traceback (most recent call last):
  File "main.py", line 8, in <module>
    n = create(Test)
RuntimeError: tr1::bad_weak_ptr

抽出された親へのポインターをshared_ptrに変換しようとすると、Pythonでfree()の無効なポインターエラーが発生します。

この問題を回避する方法はありますか、それともBoost Pythonで弱いポインターの使用をあきらめる必要がありますか?

4

2 に答える 2

2

私はPythonのものなしでコードで遊んだ。

これは問題を再現しました:

Parent* p(new Parent);
p->initialize();

問題は、shared_ptrオブジェクトを保持しているものが何もないことです。これはそれを修正します:

boost::shared_ptr<Parent> p(new Parent);
p->initialize();

Boost.Python FAQ:「shared_ptrがPythonから変換されると、shared_ptrは実際に含まれているPythonオブジェクトへの参照を管理します。shared_ptrがPythonに変換されると、ライブラリはそれがそれらの「Pythonオブジェクトマネージャー」の1つであるかどうかを確認します。もしそうなら、元のPythonオブジェクトを返すだけです」

Parent *は、なんらかの方法でshared_ptrに保存する必要があります。まだわかりません。

Parent* parent = boost::python::extract<Parent*>(instance);
于 2009-11-01T11:51:02.943 に答える
1

class_のインターフェースを使用すると、オブジェクトの保持方法を制御できます。これは、HeldTypeと呼ばれるテンプレートパラメータです。class_のBoost.Pythonドキュメントに詳細がありますが、Pythonバインディングは次のようになります。

class_<Parent, boost::shared_ptr<Parent> >("Parent");
于 2011-08-09T01:57:15.180 に答える