映射、多态和删除 我有一个问题,使用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