10
EventManager
클래스는 C++로 작성되었으며 Python에 노출되어 있습니다. 이것은 그것이 파이썬 측에서 사용하는 I 의도 방법이다. (add-
및 remove-
가 EventManager
정적 함수로서 노출)Boost.Python : 클래스 함수 콜백
class Something:
def __init__(self):
EventManager.addEventHandler(FooEvent, self.onFooEvent)
def __del__(self):
EventManager.removeEventHandler(FooEvent, self.onFooEvent)
def onFooEvent(self, event):
pass
상기 코드 문제는 콜백이다 boost::python::object
인스턴스 안에 캡처됩니다. 내가 self.onFooEvent
을 수행하면 참조 수를 self
으로 늘려서 삭제되지 않도록하므로 소멸자가 호출되지 않으므로 이벤트 처리기가 결코 제거되지 않습니다 (응용 프로그램의 끝 부분 제외).
코드는 self
인수 (즉, 무료 또는 정적 함수)가없는 함수에 적합합니다. 레퍼런스 카운트를 증가시키지 않도록 파이썬 함수 객체를 어떻게 캡처해야합니까? 객체에 대한 약한 참조 만 필요합니다.
어쨌든'__del__'에 의존해서는 안됩니다. 대신 이벤트 처리기를 제거하는 일반 메서드를 노출하십시오. (아마도 x = Something(); use (x); #와 같은 코드를 보게되면 [context manager] (http://docs.python.org/library/stdtypes.html#context-manager-types) x는이 시점에서 사용되지 않아야합니다 .') – delnan
@delnan 그러나 'Something'과 비슷한 클래스의 객체는 다른 C++ 관리자에게 전달됩니다. 해당 관리자는 더 이상 필요하지 않으면 삭제합니다. 나는이 .. 맥락에서 컨텍스트 관리자를 사용할 수 있다고 생각하지 않는다. –
오, 컨텍스트 관리자 제안을 무시하십시오. 그래도 삭제하는 대신 (또는 오히려 추가로) 이벤트 처리기를 제거하도록 지시해야합니다. 그렇지 않으면 메모리 관리를 더 스마트하게 만드는 다음 패치가 코드 유출을 초래할 수 있습니다. – delnan