在 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 *”类型的内存泄漏,没有找到析构函数