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

Reply via email to