检测到内存泄漏... 找不到枚举的析构函数

4 投票
1 回答
4062 浏览
提问于 2025-04-16 05:52

这段内容是关于使用swig嵌入Python的。

我有一个std::map<enum, std::string>被暴露给Python(嵌入式Python)。当脚本执行时,swig在最后会输出下面的“警告”(我猜是当这个map超出作用域时):

swig/python 检测到类型为 'std::map< MyEnum, std::string>' 的内存泄漏
... 找不到析构函数

这个.i文件是:

enum MyEnum {
 ...
};

typedef std::map<MyEnum, std::string>  MyTypedef;
%template(MyTypedef) std::map<MyEnum, std::string>;

如果我把代码中的MyEnum全部换成int,情况就没问题了。我不知道为什么swig在处理枚举时需要特殊的销毁方式,而枚举又不是PyObjects!我是不是漏掉了什么?有没有什么%magic_operator可以帮助我?
注意:我不想完全抑制“内存泄漏”的警告。

我仔细查看了swig生成的包装器,但没有找到解决办法。

1 个回答

0

可能是声明顺序的问题:std::map这个模板必须在MyEnum添加到SWIG接口之后才能声明。

我之前也遇到过这个问题(不过那时我的map键是一个无符号整数的别名),结果出现了和这里描述的一模一样的症状。

撰写回答