如何删除指向没有虚拟函数和继承的类的指针

How to delete pointer to a class without virtual functions and no inheritance

本文关键字:函数 虚拟 继承 指针 何删除 删除      更新时间:2023-10-16

当一个类具有虚拟方法时,需要编写一个虚拟析构函数来正确释放析构函数中的内存。

在我的情况下,类中没有虚拟方法,也没有任何子类。

当我使用带有"-Wdelete non-virtual dtor"标志的gcc编译程序时,我会收到一个警告。将析构函数重写为虚拟的确实可以消除警告,但我不想将类的析构函数改写为虚拟的,因为它没有任何子类。是否有任何方法可以抑制警告"-Wdelete non-virtual dtor"并告诉编译器该类没有继承-子类?这不是一个特定的gcc版本或gcc问题。

更新:发现我的类继承了其他具有虚拟函数的类,因此它本身也具有虚拟函数。

接受的答案是,我忽略了类确实是虚拟的(因为它继承了另一个具有虚拟函数的类)。由于它没有子类,应该有子类,所以我可以在类中添加"final"关键字来解决问题。

简单代码示例:

#include <iostream>
class A {
public:
int a;
virtual void f() {};
};
template<class T> void foo() {
T *obj = new T;
delete obj;
}
int main()
{
foo<A>();
std::cout << "Done" << std::endl;
}

将final添加到A类-也删除了警告。

将类标记为final(来自C++11)。

然后它就不能有一个子类,所以你不需要担心非虚拟析构函数的影响。编译器应该意识到这一点,并取消显示警告。

参考:https://en.cppreference.com/w/cpp/language/final