Using sip.transfer(), as Phil suggested, keeps the destructor of my object created by clone() from being destroyed. However, my object is still not useable as it can't find the Python implemented methods when it is called from C++ after return of clone.
Poking around, I found that sipFunctionBase::sipPySelf data member has gotten reset to zero. Using SIP trace and adding some printing in the generated sipFunctionBase.cpp file by hand, the trace back is... FunctionBase * sipFunctionBase::clone() const (this=0x083c9d90) sipPySelf = 0x419c623c python.clone init_FunctionBase sipSelf = 0x419c629c sipFunctionBase::sipFunctionBase(const FunctionBase&) (this=0x08406528) sipPySelf = 0 sipCpp = 0x8406528 python.copy dealloc_FunctionBase sipSelf = 0x419c629c sipIsSimple not const std::vector<double>& sipFunctionBase::getParameters() (this=0x08406528) sipPySelf = 0 Note - sipFunctionBase::clone() finds the Python member function and calls it. Looks ok - The sipFunctionBase copy constructor gets called followed by Python __init__ method. Looks ok - on return, dealloc_FunctionBase is called with argument of the newly created instance. It appears that sipPySelf is then set to zero! - The very first call to a member function shows indeed that the member sipPySelf is a null pointer. Any ideas, suggestions? _______________________________________________ PyKDE mailing list [email protected] http://mats.imk.fraunhofer.de/mailman/listinfo/pykde
