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)
嗯,这是第三方SDK中的一个错误.任何用作基类的类都应该有一个虚析构函数.否则,当您删除指向派生类实例的基础的指针时,将不会调用派生类的析构函数.
解决它的一种方法是不删除指向基础的指针.相反,使用dynamic_cast来获取指向派生类的指针(如果有许多类派生自该基类,这可能会很不方便).
在这种情况下,您需要向类添加虚拟析构函数,而不是从此处删除编译标志。
例如。对于类,Myclass
此错误即将到来,然后添加
virtual ~Myclass(){}
Run Code Online (Sandbox Code Playgroud)
试试这个灵魂,它会很好用的。
ben*_*san -5
实际上,我从编译中删除了 -Werror 开关并编译了程序。
现在,这些消息只是警告。
我将向供应商发送错误报告。
归档时间: |
|
查看次数: |
24976 次 |
最近记录: |