gpt4 book ai didi

python - python 脚本完成后清除所有 c++ 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:37 24 4
gpt4 key购买 nike

我有一个应用程序,实现 python 解释器,带有自定义 python 模块,导出类。示例 C++ 类可能如下所示:

class MyClass {
MyClass() { cout << "created" << endl; }
~MyClass() { cout << "destroyed" << endl; }
};

执行 python 脚本的代码如下所示:

namespace bp = boost::python;
bp::dict dict;

try {
dict = bp::dict(bp::import("__main__").attr("__dict__"));
bp::exec_file(filename, dict, dict);
} catch (bp::error_already_set &) {
// dict.clear()
PyErr_Print();
PyErr_Clear();
}

问题是,从 python 代码创建的 c++ 对象不会在脚本因异常终止后立即销毁。例如,简单脚本运行两次:

import MyModule
myobj = MyModule.MyClass()
assert False

我得到的输出(A):

// script launched first time
created
// script finished
// script launched second time
created
destroyed
// script finished
// Py_Finalize() is called
destroyed

我想要的输出(B):

// script launched first time
created
// script finished
destroyed
// script launched second time
created
// script finished
destroyed
// Py_Finalize() is called

现在,有趣的部分。如果我们取消注释 //dict.clear(),行为开始因脚本结构而异。对于上述 python 片段,我得到了输出 B(正如预期的那样),但我仍然得到 A 的脚本,例如:

import MyModule

def main():
myobj = MyModule.MyClass()
assert False

if __name__ == "__main__":
main()

如何正确删除从 Python 创建的 C++ 对象?

最佳答案

您可以将 c++ 对象的所有权授予 python。
请检查以下示例,它可能适合您。
还要检查 this链接以进一步了解通话政策。

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.
}

Python 端代码:

import MyModule

def main():
myobj = MyModule.get_objectof_MyClass()

if __name__ == "__main__":
main()

输出:

created
destroyed

关于python - python 脚本完成后清除所有 c++ 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47899493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com