在 swig 接口文件中没有调用 C++ 析构函数

Posted

技术标签:

【中文标题】在 swig 接口文件中没有调用 C++ 析构函数【英文标题】:C++ destructor not being called in a swig interface file 【发布时间】:2018-10-02 17:53:56 【问题描述】:

我正在创建 c++ 和 python 代码之间的接口。

我在 swig 接口文件中创建了一个名为 composition_api 的模块。它具有我导入到 python 模块中的方法,如下所示。

/// SWIG Interface File.
%module composition_api
%
    #include <include/mcm/compiler/compilation_unit.hpp>


    mv::CompilationUnit* getCompilationUnit(bool disableHardware)
    
        auto unit = new mv::CompilationUnit("pySwigCU");
             return unit;
    

我将它作为库导入到 python 脚本中。

Python 脚本

import composition_api as ca
compUnit = ca.getCompilationUnit(not enableHardware)

当 Python 脚本运行完毕后,C++ 源代码中不会调用 CompilationUnit 析构函数。是否必须在接口文件中创建调用delete unit的方法?

【问题讨论】:

【参考方案1】:

compUnit 的 C++ 对应物是一个指针。当compUnit 被Python 垃圾收集时,它只是对指针进行垃圾收集。它不会自动调用指针上的delete

你有几个我能想到的选择。

    将一个对象返回给 Python,该对象是指针的包装器。当对象被垃圾回收时,它的析构函数将被调用。在包装器的析构函数中添加必要的代码来删除 C++ 对象。

    在 swig 接口文件中添加显式函数来删除对象。确保在 Python 对象的作用域结束之前调用 Python 中的函数。

【讨论】:

@R Sahu 谢谢你的建议,我会尝试第二个。如果你有时间,你能描述一下你将如何做选项 1? 对于选项 2,您可以按照此处的指南进行操作,以确保正确删除。 ***.com/questions/32478649/…

以上是关于在 swig 接口文件中没有调用 C++ 析构函数的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:Lua - 将 c++ 实例作为 lua 函数参数传递

swig/python 检测到“uint32_t *”类型的内存泄漏,没有找到析构函数

如何在 SWIG 中为 c++ 创建模板函数?

在析构函数中创建检查类型图

如何使用 SWIG 在 C++ 中调用 python 函数?

c++中,析构函数和delete各有啥作用啊