继承cppyy模板类实例时报无虚析构函数警告,是否需自行添加__destruct__?
问题结论
不需要自行添加__destruct__()方法解决该警告,该警告的根源和处理方案如下:
警告触发原因
这个RuntimeWarning是cppyy绑定工具的内置类型检查逻辑触发的:
- 你继承的C++侧
slang::SyntaxRewriter模板类本身没有定义虚析构函数,和你写的Python子类没有关系 - 警告在类定义阶段触发,是因为当你写
SyntaxRewriter[SyntaxNode]时,cppyy会当场实例化C++模板、生成对应的Python绑定类,检查到父类没有虚析构就会抛出警告,和是否创建实例无关
为什么加__destruct__没用
cppyy中__destruct__是Python子类用来扩展自定义析构逻辑的钩子,无法修改C父类本身的内存布局和析构函数属性,C侧父类没有虚析构的问题无法通过Python侧代码修改。
对应处理方案
- 如果你不会把Python侧创建的
NodeRewriter实例指针传回C侧、由C代码通过SyntaxRewriter<SyntaxNode>父类指针进行delete操作,这个警告完全可以忽略,不会影响你的代码正常运行,也不会有内存泄漏问题 - 如果你有上述C侧管理Python子类实例生命周期的需求,唯一的根本解决方法是修改C侧的
slang::SyntaxRewriter代码,为其添加虚析构函数 - 如果无法修改C++代码、又不想看到该警告,可以在导入相关代码前添加警告过滤逻辑:
import warnings warnings.filterwarnings("ignore", category=RuntimeWarning, message=r".*has no virtual destructor.*")
内容的提问来源于stack exchange,提问作者DLAN
相关产品推荐
相关产品推荐

