如何删除没有虚析构函数的多态类类型的对象

ben*_*san 13 c++ inheritance destructor

当我尝试从第三方SDK编译一些代码时,我收到以下错误.

*Description    Resource    Path    Location    Type
deleting object of polymorphic class type ‘Vendor_sys::VendorCode’ which has non-virtual destructor might cause undefined behaviour [-Werror=delete-non-virtual-dtor]   PnServer.cpp    /PCounter   line 467    C/C++ Problem*
Run Code Online (Sandbox Code Playgroud)

我不知道是否可以通过对Vendor SDK的部分了解来满足这个条件,其中大部分繁重工作都是在dll或库对象中完成的.

我的构建环境是带有gpp的Eclipse Juno.

我在Google中搜索了错误消息,但未找到此错误的任何实例.

那么,如果我不能修改供应商代码的黑盒子部分,我的选择是什么?

以下是make过程中失败的代码:

delete pData->unit;
Run Code Online (Sandbox Code Playgroud)

Jiv*_*son 11

坏消息,我很害怕.您不应该将该类用作基类.太多的限制和陷阱.你可能会逃脱它,但为什么要冒风险呢?向库供应商提交错误报告.

如果您不需要多态指针,请在类中包含该类型的对象,并委托您要继承的成员函数.

class my_class {
private:
    evil_class evil;
public:
    virtual ~my_class() {/* stuff */}
    virtual int member() { return evil.member(); }
};
Run Code Online (Sandbox Code Playgroud)


use*_*015 9

嗯,这是第三方SDK中的一个错误.任何用作基类的类都应该有一个虚析构函数.否则,当您删除指向派生类实例的基础的指针时,将不会调用派生类的析构函数.

解决它的一种方法是不删除指向基础的指针.相反,使用dynamic_cast来获取指向派生类的指针(如果有许多类派生自该基类,这可能会很不方便).


spt*_*025 9

在这种情况下,您需要向类添加虚拟析构函数,而不是从此处删除编译标志。

例如。对于类,Myclass此错误即将到来,然后添加

virtual ~Myclass(){}
Run Code Online (Sandbox Code Playgroud)

试试这个灵魂,它会很好用的。


ben*_*san -5

实际上,我从编译中删除了 -Werror 开关并编译了程序。

现在,这些消息只是警告。

我将向供应商发送错误报告。

  • 根据我的说法,这不是正确的方法,除非没有其他方法,否则您不应该仅仅为了编译代码而更改编译标志 (3认同)