我在使用C++映射存储指向基类和某些派生类的指针时遇到问题。
让我用一段相当长但简单的代码来解释:
#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;
}
运行结果:
Base DTOR
Base DTOR
所以,事情是,当我将派生类指针插入到我的映射中时,底层对象被视为基类;所以调用的析构函数是基类之一,而不是派生类。 Valgrind 确认我每次都丢失 16 个字节。
另外,我不能使用 Boost 的 shared_ptr ( I saw some mentions of it here ),而且我使用的嵌入式架构不支持 C++ 异常和 RTTI(在我的情况下,这会导致一些未对齐的访问和其他不好的东西)( 编辑 :不相关) .
你知道我该如何解决这种行为吗?
最佳答案
你的虚拟析构函数在哪里???!!!
Read this 和 永远不会忘记 。真的,你刚刚违反了 10 条 C++ 戒律之一...... :))
关于c++ - std::map、多态和删除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6441925/