Also, i found that i manually call 'Py_XINCREF' on callback object (ie on 'a1' in this example) then script is terminating without errors and do not see destructor call for a1 object (but i guess later one is expected). Thoughts?
On Sun, Mar 15, 2015 at 6:11 PM, Ernie Lee <tr.erni...@gmail.com> wrote: > 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