PothPython:从C++删除对象

2024-10-06 12:36:57 发布

您现在位置:Python中文网/ 问答频道 /正文

简短的解释。我正在写一个游戏引擎。我使用OpenGL进行渲染,使用Boost::Python编写脚本。现在一切都很好。我正在实现处理事件的侦听器类。例如,此类在呈现期间触发事件:

class FrameListener
    {
    public:
        struct FrameEvent
        {
            double TimeSinceLastEvent;
            double TimeSinceLastFrame;
        };

        virtual void FrameStart(FrameEvent& evt) = 0;
        virtual void FrameEnd(FrameEvent& evt) = 0;
        virtual void OnFrame(FrameEvent& evt) = 0;
    };

这是一个基本FrameListener类,包含3个在不同呈现阶段触发的事件。下面是python的包装类:

^{pr2}$

这个很好用。例如,我可以用python创建这个类,它将在10秒内关闭游戏:

class SimpleListener(FrameListener):
time = 0
def __init__(self):
    super(self.__class__, self).__init__()
def OnFrame(self, evt):
    self.time += evt.TimeSinceLastFrame
    if self.time > 10:
        CORE_ENGINE.Shutdown()

然后打电话给CORE_引擎.AddListener(SimpleListener())从python将侦听器添加到std::vector FrameListeners:

if (FrameListener* listen = boost::python::extract< FrameListener* >(listener))
    {
        FrameListeners.push_back(listen);
    }

所有这一切都很顺利。但是我有一个函数RemoveAllListeners,它应该删除所有的侦听器。我试过这样的方法:

    vector<FrameListener*>::iterator it;
for ( it = FrameListeners.begin(); it != FrameListeners.end(); ){
      delete * it;         
}

很明显会崩溃。我假设指向基本FrameListener的指针被销毁,但python SimpleListener对象仍然是悬挂指针?如何正确地从C++代码中销毁那些Python继承的框架文件?在

干杯,普索!在


Tags: 引擎self游戏timevirtual事件itclass