映射、多态和删除 我有一个问题,使用C++映射来存储基类和一些派生类的指针。

映射、多态和删除 我有一个问题,使用C++映射来存储基类和一些派生类的指针。,c++,dictionary,polymorphism,rtti,delete-operator,C++,Dictionary,Polymorphism,Rtti,Delete Operator,让我用一段很长但很简单的代码来解释: #include <map> #include <iostream> struct foo{ int dummy[4]; }; struct bar{ int additionnal[4]; }; class Base { private: struct foo *_internal_structure; public: Base() { _internal_structure = new struct foo;

让我用一段很长但很简单的代码来解释:

#include <map>
#include <iostream>

struct foo{ int dummy[4]; };
struct bar{ int additionnal[4]; };

class Base
{
private:
    struct foo *_internal_structure;
public:
    Base() { _internal_structure = new struct foo; }
   ~Base()
   {
        delete _internal_structure;
        std::cout << "Base DTOR\n";
   }
};

class Derived: public Base
{
private:
    struct bar *_additional_structure;
public:
    Derived() { _additional_structure = new struct bar; }
   ~Derived()
   {
        delete _additional_structure;
        std::cout << "Derived DTOR\n";
   }
};


int main(int argc, char *argv[])
{
    std::map<int, Base*> my_map;
    Base *to_add = new Base();
    Derived *derived_to_add = new Derived();
    my_map[1] = to_add;
    my_map[2] = derived_to_add; // works, derived class, but object gets sliced

    /// clear hash map ///
    std::map<int, Base*>::const_iterator iter;
    for(iter = my_map.begin(); iter != my_map.end(); ++iter)
    {
        delete (*iter).second;
    }

    return 0;
}
所以,问题是,当我在映射中插入派生类指针时,底层对象被视为基类;因此,调用的析构函数是基类的析构函数,而不是派生类的析构函数。Valgrind证实我每次都会丢失16个字节

也不能使用Boost的SyrdJPTR(),我使用的嵌入式架构不支持C++异常和RTTI(在我的例子中,这会导致一些不对齐的访问和其他坏的东西)(<强>编辑< /强>:不相关)。


您知道如何修复此行为吗?

任何基类中的析构函数都应该是虚拟的

否则,在子类通过指向其基类的指针引用的情况下,在运行时不可能确定实际应该调用什么析构函数。

您的虚拟析构函数在哪里???!!!
,永远不要忘记。真的,你刚刚打破了10条C++命令中的一条……)) @Vlad:如果我知道红色的正确语法就好了:)链接好像死了。你能提供一个有效的吗?与你的问题无关,但那些数据成员应该是
boost::scoped_ptr
const std::auto_ptr
而不是普通的指针。@Tadeusz:我不能使用boost,我在最后一段说:)我会研究auto_ptr,谢谢。更新编译器有一些东西从Boost中传播到新的C++标准中,这将是有益的。请参阅<代码> STD::UnQuyGPPTR <代码>或<代码> STD::SyrdYPPTR < /C> >如果你在当前VisualC++(或GCC I认为)上。
Base DTOR
Base DTOR