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.