如何在没有虚函数且没有继承的情况下删除指向 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析构函数的影响。编译器应该意识到这一点并抑制警告。

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