从派生类中释放对象的位置?

时间:2016-06-06 07:17:49

标签: c++

在构建课程时需要一些帮助:

FBPermission::FBPermission(QString aName): QMap<QString, bool>()
{
    Name = aName;
    insert("read", false);
    insert("write", false);
    insert("rename", false);
    insert("delete", false);
}
FBPermission::  ~FBPermission(){}

Fachbereich::Fachbereich()
{
permissions= QList<FBPermission *>();

FBPermission * perm = new FBPermission("admin");

perm->insert("read", true);
perm->insert("write", true);
perm->insert("rename", true);
perm->insert("delete", true);
permissions.append(perm);

}
Fachbereich::~Fachbereich()
{

}

我的第一堂课是从QMap派生的。在我的第二课中,我拿着一个包含头等指针的列表。如果是的话,我是否必须在析构函数中释放它们,在第一类或第二类的析构函数中?

3 个答案:

答案 0 :(得分:1)

是的,你应该在析构函数中释放它们。

由于Fachbereich类分配数据,因此它也应该是解除分配数据的类。通常,如果一个类分配了某些东西,那么它也应该是释放它的那个。

从未编写的类继承时也要小心。为了使所有虚拟机制正常工作,基类应该有一个虚拟析构函数。如果不是这样,您可能会遇到这样一种情况,即在保存指向基类的指针时删除派生类,因为它没有虚拟析构函数,只会销毁基类而不运行派生类的析构函数,导致令人讨厌的内存泄漏。可能还有其他非常微妙的问题,你很可能不想处理。

答案 1 :(得分:0)

是的,你必须delete他们。您可以在Fachbereich的析构函数中执行此操作,例如:

while (!permissions.isEmpty())
    delete permissions.takeFirst();

您无法在FBPermission的析构函数中执行此操作,这是new编辑的元素。

答案 2 :(得分:0)

首先,从QMap得出一个可怕的想法。主要是因为它是一个值类而不支持继承。知道不支持继承的类的最简单方法是don't define a virtual destructor

不需要在堆上分配值类,除非你有令人信服的理由这样做。另外,请参阅:Prefer composition over inheritance?this

要销毁这些项目,你可以在析构函数

中完成
Fachbereich::~Fachbereich()
{
    for(auto& item : permissions)
        delete item;
}