C++ 类COM接口警告非虚拟析构函数

C++ 类COM接口警告非虚拟析构函数,c++,com,abstract-class,virtual-destructor,C++,Com,Abstract Class,Virtual Destructor,有没有办法告诉gcc它编译的抽象类不需要虚拟析构函数(就像COM对象从来没有过的那样)?例如,NSI总是抱怨缺少虚拟析构函数。关闭警告将不会有帮助,因为我可能有非COM类的类,而我需要此警告 因此_属性_((com_接口))已被弃用,仅更改vtable布局。是否有另一个_u属性_uu,我可以告诉编译器我不想被警告这个类上缺少析构函数?您可能需要使用一对。否则,#pragma GCC system_header将禁用给定文件中的所有警告。缺少虚拟dtor警告是有原因的-主要是因为跟踪它是一个调试噩

有没有办法告诉gcc它编译的抽象类不需要虚拟析构函数(就像COM对象从来没有过的那样)?例如,NSI总是抱怨缺少虚拟析构函数。关闭警告将不会有帮助,因为我可能有非COM类的类,而我需要此警告


因此_属性_((com_接口))已被弃用,仅更改vtable布局。是否有另一个_u属性_uu,我可以告诉编译器我不想被警告这个类上缺少析构函数?

您可能需要使用一对。否则,
#pragma GCC system_header
将禁用给定文件中的所有警告。

缺少虚拟dtor警告是有原因的-主要是因为跟踪它是一个调试噩梦,尤其是在大型复杂的代码库中

您可能有这样做的一个非常具体的原因,但请扪心自问,如果一个类被重构,以致其使用在以后发生变化,会发生什么情况?

我认为您应该重新考虑禁用此警告。这是有原因的。今天,不在类中放置虚拟析构函数可能是正确的,但您无法准确预测将来如何使用您的类

该类使用方式的细微变化可能会导致下一个开发人员花费数小时试图追踪资源泄漏。帮那个人一个忙,现在让析构函数虚拟化

你也可以问问自己

通过使其非虚拟化,我能获得什么

您提到有一个抽象类,所以我假设它至少有一个虚拟函数。因此,使析构函数虚拟并不会向对象添加v表,它只是扩展它以包含另一个成员


我看不出让这个非虚拟化有什么真正的好处。只有问题

谢谢。但对于COM,我指的是xpcom、windows COM或类似的东西。windows的IUnknown没有虚拟析构函数。mozilla的支持没有虚拟析构函数。始终使用IUnknown/nsISupports::release()函数删除这些类及其派生。不需要使用delete删除它们。那么,COM接口没有虚拟析构函数,但其他类有虚拟析构函数,这有什么原因吗?