On 08/01/2011 07:50 AM, diego_pmc wrote:
I have an `EventManager` class written in C++ and exposed to Python. This is how I intended for it to be used from the Python side:class Something: def __init__(self): EventManager.addEventHandler(FooEvent, self.onFooEvent) def __del__(self): EventManager.removeEventHandler(FooEvent, self.onFooEvent) def onFooEvent(self, event): pass (The `add-` and `remove-` are exposed as static functions of `EventManager`.) The problem with the above code is that the callbacks are captured inside `boost::python::object` instances; when I do `self.onFooEvent` these will increase the reference count of `self`, which will prevent it from being deleted, so the destructor never gets called, so the event handlers never get removed (except at the end of the application). The code works well for functions that don't have a `self` argument (i.e. free or static functions). How should I capture Python function objects such that I won't increase their reference count? I only need a weak reference to the objects.
Are these cycles actually a problem in practice? Python does do garbage collection, so it might be that it knows about all these dependencies and just hasn't bothered to try to delete them because it doesn't need the memory yet.
Anyhow, as the other reply suggested, one option is clearly weakref (in addition, look at http://docs.python.org/c-api/weakref.html for how to use those in C/C++; there's no special Boost.Python interface for them).
Unfortunately, what could have been a better option - implementing the special functions that tell Python how to break cycles in your C++ classes (http://docs.python.org/c-api/gcsupport.html) - is pretty low level, and probably impossible with Boost.Python.
Good luck! Jim Bosch _______________________________________________ Cplusplus-sig mailing list [email protected] http://mail.python.org/mailman/listinfo/cplusplus-sig
