如何在没有虚函数且没有继承的情况下删除指向 class 的指针
How to delete pointer to a class without virtual functions and no inheritance
当class有虚方法时,需要写一个虚析构函数来正确释放析构函数中的内存。
就我而言,我在 class 中没有虚方法,也没有任何子 class 方法。
当我使用带有“-Wdelete-non-virtual-dtor”标志的 gcc 编译程序时,我收到警告。
将析构函数重写为虚拟确实删除了警告,但我不想将 class 的析构函数重写为虚拟,因为它没有任何子 classes。
有什么方法可以抑制警告“-Wdelete-non-virtual-dtor”并告诉编译器没有继承 - sub-classes for this class?
这不是特定的 gcc 版本或 gcc 问题。
更新:
发现我的 class 继承了其他具有虚函数的 class,因此它本身也具有虚函数。
接受的答案是我错过了 class 确实是虚拟的(因为它继承了另一个具有虚拟功能的 class)。由于它没有子 classes 而应该有,我可以将 "final" 关键字添加到 class 来解决这个问题。
简单代码示例:
#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 添加到 class A - 也删除了警告。
将 class 标记为 final
(来自 C++11)。
那么它就不能有child class,所以你不用担心有non-virtual析构函数的影响。编译器应该意识到这一点并抑制警告。
当class有虚方法时,需要写一个虚析构函数来正确释放析构函数中的内存。
就我而言,我在 class 中没有虚方法,也没有任何子 class 方法。
当我使用带有“-Wdelete-non-virtual-dtor”标志的 gcc 编译程序时,我收到警告。 将析构函数重写为虚拟确实删除了警告,但我不想将 class 的析构函数重写为虚拟,因为它没有任何子 classes。 有什么方法可以抑制警告“-Wdelete-non-virtual-dtor”并告诉编译器没有继承 - sub-classes for this class? 这不是特定的 gcc 版本或 gcc 问题。
更新: 发现我的 class 继承了其他具有虚函数的 class,因此它本身也具有虚函数。
接受的答案是我错过了 class 确实是虚拟的(因为它继承了另一个具有虚拟功能的 class)。由于它没有子 classes 而应该有,我可以将 "final" 关键字添加到 class 来解决这个问题。
简单代码示例:
#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 添加到 class A - 也删除了警告。
将 class 标记为 final
(来自 C++11)。
那么它就不能有child class,所以你不用担心有non-virtual析构函数的影响。编译器应该意识到这一点并抑制警告。