
*I abstract the problem below:* t1.cpp: #include <boost/python.hpp> #include <boost/enable_shared_from_this.hpp> #include <boost/shared_ptr.hpp> #include <iostream> #include <string> #include <list> using namespace std; using namespace boost::python; static object mainobj, global; class A : public boost::enable_shared_from_this<A> { public: void test(); }; class X { public: void test(boost::shared_ptr<A> pObj){} }; typedef boost::shared_ptr < A > A_ptr; typedef boost::shared_ptr < X > X_ptr; X_ptr xx; void A::test() { object aa = global[ "aa" ]; A_ptr pa( shared_from_this() ); aa( xx, pa ); } BOOST_PYTHON_MODULE(pythonobject) { class_ <A>("A") .def("test", &A::test) ; class_ <X>("X") .def("test", &X::test) ; register_ptr_to_python <A_ptr>(); register_ptr_to_python <X_ptr>(); } int main() { Py_Initialize(); initpythonobject(); PyRun_SimpleString("import pythonobject"); mainobj = import("__main__"); global=(mainobj.attr("__dict__")); A_ptr a( new A ); X_ptr x( new X ); xx = x; try { exec_file("t1.py", global, global); a->test(); a->test(); a->test(); } catch (error_already_set) { PyErr_Print(); } return 0; } t1.py: #!/usr/bin/python #coding:utf-8 def aa(x,a): x.test( a ) return 1 *after execute t1.cpp , I got this erro info: terminate called after throwing an instance of 'boost::bad_weak_ptr' what(): tr1::bad_weak_ptr When debug the program, I found after first "a->test()" call, a._internal_weak_this.use_count became 0. It's obviously wrong... so the after "a->test()" will cause error. But if change void test(boost::shared_ptr<A> pObj){} to void test(A* pObj){} I got no error. The errror is gone. Will someone explain this prolbem to me? Thank you.*