Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:回调类函数 我有C++编写的 EngestMeuns/Cuff>类,并被暴露于Python。这就是我打算从Python方面使用它的方式: class Something: def __init__(self): EventManager.addEventHandler(FooEvent, self.onFooEvent) def __del__(self): EventManager.removeEventHandler(FooEvent, self.onFooEvent) def onFooEvent(self, event): pass_C++_Python_Boost - Fatal编程技术网

Python:回调类函数 我有C++编写的 EngestMeuns/Cuff>类,并被暴露于Python。这就是我打算从Python方面使用它的方式: class Something: def __init__(self): EventManager.addEventHandler(FooEvent, self.onFooEvent) def __del__(self): EventManager.removeEventHandler(FooEvent, self.onFooEvent) def onFooEvent(self, event): pass

Python:回调类函数 我有C++编写的 EngestMeuns/Cuff>类,并被暴露于Python。这就是我打算从Python方面使用它的方式: class Something: def __init__(self): EventManager.addEventHandler(FooEvent, self.onFooEvent) def __del__(self): EventManager.removeEventHandler(FooEvent, self.onFooEvent) def onFooEvent(self, event): pass,c++,python,boost,C++,Python,Boost,(添加-和删除-作为EventManager的静态函数公开) 上述代码的问题在于回调是在boost::python::object实例中捕获的;当我执行self.onFooEvent操作时,这些操作将增加self的引用计数,这将防止删除它,因此不会调用析构函数,也不会删除事件处理程序(应用程序结束时除外) 该代码适用于没有self参数的函数(即自由函数或静态函数)。我应该如何捕获Python函数对象,这样就不会增加它们的引用计数?我只需要对对象的弱引用。如果没有weakref.ref(self.

(添加-和删除-作为
EventManager
的静态函数公开)

上述代码的问题在于回调是在
boost::python::object
实例中捕获的;当我执行
self.onFooEvent
操作时,这些操作将增加
self
的引用计数,这将防止删除它,因此不会调用析构函数,也不会删除事件处理程序(应用程序结束时除外)


该代码适用于没有
self
参数的函数(即自由函数或静态函数)。我应该如何捕获Python函数对象,这样就不会增加它们的引用计数?我只需要对对象的弱引用。

如果没有weakref.ref(self.onFooEvent),您将永远无法获得预期的行为!查看我的评论。

无论如何,你不应该依赖于
\uu del\uu
。相反,公开一个常规方法来删除事件处理程序。(如果你看到代码,比如代码< x=某个东西),使用它(x);x x应该不从这个点向前使用<代码>,但是类似于<代码>类的对象<某物>代码>本身将被传递给另一个C++管理器。当经理不再需要它们时,它会删除它们。我不认为我可以在这里使用上下文管理器。。嗯,背景。哦,那就别提背景经理的建议了。尽管如此,您还是应该告诉他们删除事件处理程序,而不是(或者更确切地说,除了)将它们删除到。否则,下一个使内存管理更智能的补丁可能会使您的代码泄漏。@delnan“智能”是什么意思?我想知道你的想法是我可以应用的(现在或以后)。或者你只是在做一般性的陈述?:)@德南:谢谢你的信息。我会小心的,但我不知道循环是如何在我的代码中形成的。对象的所有者是众所周知的(这是我提到的另一个管理者)。