Hi Stefan, I tried to create minimal tests and it turned out that there might be two separate issues here: one related to memory management and other to subclassing C++ classes in Python (i will post the subclassing example in separate mail).
Running code below as-is works fine and i can see printed message generated by ‘A’ class destructor. However commenting out line ‘reset_callback()’ in Python code will lead to a segfault and also no call to ‘A’ class destructor occur. Thoughts? Thanks, Ernie. Python code: ———————— from callback2 import * a1 = A() a1.info() set_callback(a1) test_callback() reset_callback() C++ code: —————————— include <iostream> #include <boost/shared_ptr.hpp> #include <boost/python.hpp> class A { public: virtual ~A() { std::cout << "A destructor for object: " << this << std::endl; } virtual void info() { std::cout << "C++ A info for object" << this << std::endl; } }; static boost::shared_ptr<A> current_callback; void set_callback(boost::shared_ptr<A> a) {current_callback = a; } void reset_callback() { current_callback = boost::shared_ptr<A>(); } void test_callback() { std::cout << "test_callback: "; if(current_callback) current_callback->info(); else std::cout << "Callback is NULL!" << std::endl; } BOOST_PYTHON_MODULE(callback2) { boost::python::class_<A, boost::shared_ptr< A >, boost::noncopyable>("A") .def("info", &A::info) ; boost::python::def("set_callback", set_callback); boost::python::def("reset_callback", reset_callback); boost::python::def("test_callback", test_callback); } ———————————————— On Wed, Mar 11, 2015 at 12:01 AM, Stefan Seefeld <ste...@seefeld.name> wrote: > On 10/03/15 11:24 PM, Ernie Lee wrote: > > Hi Stefan, > > > > I updated my code so it now use 'boost::shared_ptr' class while > > specifying the held-type and i got exactly the same errors (i guess > > boost did recognize class even in different namespace). > > > > Any other theories of what could be wrong? Could it be that Python > > in some cases tries to manage memory directly, disregarding SP layer? > > In that case I suggest you narrow down the failure into a minimal test > case and send that to the list. Otherwise this would be highly > speculative and thus inefficient. > > Regards, > Stefan > > -- > > ...ich hab' noch einen Koffer in Berlin... > > _______________________________________________ > Cplusplus-sig mailing list > Cplusplus-sig@python.org > https://mail.python.org/mailman/listinfo/cplusplus-sig >
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org https://mail.python.org/mailman/listinfo/cplusplus-sig