【问题标题】:How to wrap c++ object with boost.Python, so that Python will never call it destructor automatically如何用 boost.Python 包装 c++ 对象,使 Python 永远不会自动调用它的析构函数
【发布时间】:2011-05-01 20:56:22
【问题描述】:

例如,我有 C++ 类“A”和 python 类“B”。用 boost::python 包裹的“A”类,所以我可以在我的 python 代码中使用它。 “B”类有一个“A”类型的成员,我在“B”的构造函数中创建它。当我删除类“B”的对象时,它会自动在 C++ 中调用“A”的析构函数。我想避免这个调用,以便“B”不会对其成员“A”(即包装的 c++ 对象)负责。所以,我想删除我的“B”对象,并在内存中仍然有“A”。

【问题讨论】:

    标签: c++ python boost


    【解决方案1】:

    你应该在你的“B类”中保留一个指向“A类对象”的指针,这样当“B对象”被破坏时,“A类对象”就不会被回收。

    编辑:

    我认为这可以解决您的问题:

    aObjectPTR = POINTER(aObj)
    

    现在,您有一个名为“aObjectPTR”的指针。 放置 A 类对象的名称而不是“Aobj”。 之后,你就有了一个指向 A 类对象的指针,这样指针(aObjectPTR) 只会被回收,而不是它指向的对象。

    【讨论】:

    • 如何用 python 和 boost 实现它?
    • 感谢您的快速回复,但这无济于事。当我在 VS 中编写 tmp = POINTER(MyClass(args...)) 和调试时,我看到 MyClass 的析构函数在构造函数之后被调用。
    • @user733662:在您的声明中,您写了“POINTER(MyClass(args...))”,“MyClass(args...)”表示您在运行中创建了一个新对象,所以当没有参考时,它将被回收。而且您必须在类中而不是在构造函数中声明指针变量全局。并且对 AObject 的引用必须传递给 B 类的构造函数。而且我认为您应该提供代码,以便更容易识别失败。
    猜你喜欢
    • 2016-11-08
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2018-09-16
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2016-09-12
    相关资源
    最近更新 更多