清理所有c++;python脚本完成后的对象
我有一个应用程序,用自定义python模块实现python解释器,导出类。示例C++类可能看起来像:清理所有c++;python脚本完成后的对象,python,c++,boost,boost-python,Python,C++,Boost,Boost Python,我有一个应用程序,用自定义python模块实现python解释器,导出类。示例C++类可能看起来像: class MyClass { MyClass() { cout << "created" << endl; } ~MyClass() { cout << "destroyed" << endl; } }; 问题是,在异常终止脚本后,不会立即销毁由Python代码创建的C++对象。例如,简单脚本运行两次: import MyMod
class MyClass {
MyClass() { cout << "created" << endl; }
~MyClass() { cout << "destroyed" << endl; }
};
问题是,在异常终止脚本后,不会立即销毁由Python代码创建的C++对象。例如,简单脚本运行两次:
import MyModule
myobj = MyModule.MyClass()
assert False
我得到的输出(A):
我想要的输出(B):
现在,有趣的部分。如果我们取消注释//dict.clear()
,根据脚本结构,行为开始不同。对于上面提到的python代码片段,我得到了输出B(如预期),但对于脚本,我仍然得到A,如:
import MyModule
def main():
myobj = MyModule.MyClass()
assert False
if __name__ == "__main__":
main()
如何正确删除由Python创建的C++对象?
< p>您可以将C++对象所有权归为Python。 请检查下面的示例,它可能适合您。另外,请查看链接以了解更多呼叫策略 C++代码:
class MyClass {
public:
MyClass() { cout << "created" << endl; }
~MyClass() { cout << "destroyed" << endl; }
};
MyClass* get_objectof_MyClass(){
return new MyClass();
}
BOOST_PYTHON_MODULE(MyModule)
{
class_<MyClass>("MyClass");
def("get_objectof_MyClass", get_objectof_MyClass, return_value_policy<manage_new_object>());
//using manage_new_object we are giving ownership to python side and python will clean it up when out of scope.
}
输出:
created
destroyed
考虑使用Python的上下文管理器,即<>代码> 语句。@ NickyC,ToE是,Python脚本不受限制。只是解释器,运行它们,然后恢复应用程序状态。不知道这对您的用例是否实用,但是您可以让MyClass构造函数将MyClass对象(this)添加到静态/全局链表中,并让MyClass析构函数从链表中删除(this)。然后,在您的Python脚本退出之后,您的C++代码可以遍历该链表并删除列表中保留的任何MyC类对象。@ JeremyFriesner,Python完全拥有C++对象。将它们添加到列表中将只存储副本(不是我想要的),或者存储引用计数的指针副本(不会删除它们)。试图绕过python API直接删除对象将导致崩溃。那么,为什么输出中有两对“已创建”和“已销毁”?发生隐式复制
import MyModule
def main():
myobj = MyModule.MyClass()
assert False
if __name__ == "__main__":
main()
class MyClass {
public:
MyClass() { cout << "created" << endl; }
~MyClass() { cout << "destroyed" << endl; }
};
MyClass* get_objectof_MyClass(){
return new MyClass();
}
BOOST_PYTHON_MODULE(MyModule)
{
class_<MyClass>("MyClass");
def("get_objectof_MyClass", get_objectof_MyClass, return_value_policy<manage_new_object>());
//using manage_new_object we are giving ownership to python side and python will clean it up when out of scope.
}
import MyModule
def main():
myobj = MyModule.get_objectof_MyClass()
if __name__ == "__main__":
main()
created
destroyed