删除具有非虚拟析构函数的对象将导致

时间:2017-03-05 04:06:19

标签: c++

我收到警告:

error: deleting object of abstract class type ‘Converter::ConversionImpl’ which has non-virtual destructor will cause undefined behavior [-Werror=delete-non-virtual-dtor]
     delete it->second;
                ^~~~~~

这使我在解决方面遇到了一些困难。我试过应用虚拟,但我怀疑这与地图有关,这是一个多图,我似乎无法找到虚拟删除操作符的替代品。事实上,我的所有研究表明,这实际上是正确的方法,如果有点不标准的话。 (没有一个研究实例与这里实际完成的内容相匹配)。

typedef multimap<int,ConversionImpl*> ConversionImplList;

struct CRegistry {
    ConversionImplList list;
    CRegistry();

    ~CRegistry()
    {
        for (ConversionImplList::iterator it=list.begin(); it!=list.end(); ++it)
        {
            delete it->second;
        }

        list.clear();
    }
};

为什么它会抛出第二个问题,而不是整个析构函数,哪里是找到涵盖这种情况的材料的最佳位置?

Code in Full(不是我同意的世界上最好的作品,我仍然围绕着一切)。 Converter.h

修改

此解决方案在下面的注释中指出,并引用在关联标头中声明的类,而不是文件本身。这里的关键是要仔细查看警告信息的措辞,因为这些词语意味着具体的事情。

在这种情况下,类升级为1,未能将析构函数声明为“虚拟”。很有可能,当出现类似的错误时,这可能是原因。

1 个答案:

答案 0 :(得分:0)

我在代码中找不到指针添加到list的位置。但是,您无法将具有纯虚函数的类实例化为完整类型,例如s Converter::ConversionImpl。因此,list中的元素无法指向多态类型Converter::ConversionImpl的对象。您必须先继承此类才能使用它。

将实现添加到纯虚函数或从类派生并使析构函数也是虚拟的。在这种情况下,您将需要覆盖基类中的虚函数。