如何删除指向没有虚拟函数和继承的类的指针
How to delete pointer to a class without virtual functions and no inheritance
当一个类具有虚拟方法时,需要编写一个虚拟析构函数来正确释放析构函数中的内存。
在我的情况下,类中没有虚拟方法,也没有任何子类。
当我使用带有"-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
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 重载 -> shared_ptr 个实例中的箭头运算符<interface>,接口中没有纯虚拟析构函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 是否可以使用函数指针调用虚拟析构函数?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- 虚拟继承基构造函数消除
- "虚拟""覆盖"析构函数
- 类中的虚拟布尔函数参数不起作用
- 用纯虚拟函数兜圈子
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- 尝试在 QLabel 上绘画失败(无法在没有对象的情况下调用成员函数"虚拟无效 QLabel::p aintEvent(QPaintEvent*)")
- 声明析构函数虚拟就足够了吗?
- 视觉 C++当我们在基类中使函数成为纯虚拟时,那么在子类中再次使相同的函数虚拟的必要性是什么
- 重载函数(虚拟/非虚拟)