std::映射、多态性和删除
std::map, polymorphism and delete
我在使用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 DTORn";
}
};
class Derived: public Base
{
private:
struct bar *_additional_structure;
public:
Derived() { _additional_structure = new struct bar; }
~Derived()
{
delete _additional_structure;
std::cout << "Derived DTORn";
}
};
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
因此,当我将Derived类指针插入到映射中时,底层对象被视为Base类别;因此,调用的析构函数是基类中的一个,而不是派生类。Valgrind证实我每次都丢失16个字节。
此外,我不能使用Boost的shared_ptr(我在这里看到了一些提到它的地方),而且我使用的嵌入式架构不支持C++异常和RTTI(在我的情况下,这会导致一些未对齐的访问和其他不好的东西)(编辑:不相关)。
你知道我怎样才能纠正这种行为吗?
虚拟析构函数在哪里
阅读这篇文章,永远不要忘记。真的,你刚刚违反了C++的10条戒律中的一条…:)
任何基类中的析构函数都应该是虚拟的。
否则,在通过指向基类的指针引用子类的情况下,在运行时不可能确定实际应该调用什么析构函数。
相关文章:
- 多态性和功能结合
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- C++boost序列化多态性问题
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- 具有智能指针的多态性
- 在 C++ 中在堆栈上创建实例时如何保持多态性?
- 继承/多态性 - 我是否被迫使用"protected"变量?
- C++ 多态性在代码::块 17.12 中不起作用
- C++ 泛型和多态性:这种模式可行吗?
- 为什么我们实际上需要运行时多态性?
- 如何在这个简单的最小示例中实现多态性?
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 无法初始化已知大小的矢量指针,该大小不会因多态性而更改
- 运行时多态性和dynamic_cast需要澄清
- 如何调用指针类型的方法(禁用多态性)?
- C - 删除多态性指针
- C++删除类指针和多态性
- std::映射、多态性和删除