Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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
清理所有c++;python脚本完成后的对象_Python_C++_Boost_Boost Python - Fatal编程技术网

清理所有c++;python脚本完成后的对象

清理所有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

我有一个应用程序,用自定义python模块实现python解释器,导出类。示例C++类可能看起来像:

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